Hallo,
weil es mich genervt hat, in C++ dauernd nachzugucken wie man jetzt das ganze TCP-zeug da macht, hab ich mal (schnell) eine UDF für die TCP-Funktionen wie in Autoit gemacht. Nichts großes, aber ich glaube ganz nützlich. Viel Spaß damit an die, die es benutzen wollen
Freue mich über Rückmeldungen,
Code:
Spoiler anzeigen
C
//TCP Funktionen aus Autoit
#pragma comment(lib, "libws2_32.a"); //Lib in Projekt einbinden (Linker) um Fehler zu vermeiden
#include <winsock2.h>
#include <windows.h>
//Globals
WSADATA wsadata;
bool TCPStartup();
SOCKET TCPListen(char* ip,int port,int maxcon=100);
SOCKET TCPAccept(SOCKET lima);
SOCKET TCPConnect(char* ip,int port);
void TCPSend(SOCKET sock,char* data);
char* TCPRecv(SOCKET sock,int maxlength);
char* TCPNameToIP(char* unresolvedIP);
void TCPCloseSocket(SOCKET sock);
void TCPShutdown();
char* cat(char* c1,char* c2);
void SayWhatError();
void LastError();
class Error
{
public:
char* meldung;
char errcode[51];
Error(char* meld,int errc)
{
meldung=meld;
itoa(errc,errcode,10);
}
};
bool TCPStartup()
{
int starterr=WSAStartup(MAKEWORD(2,2),&wsadata);
if (starterr!=0)
{
//SayWhatError
return false;
}
return true;
}
SOCKET TCPListen(char* ip,int port,int maxcon)
{
if (ip=="") ip=INADDR_ANY;
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in in;
in.sin_port=htons(port);
in.sin_addr.s_addr=inet_addr(ip);
in.sin_family=AF_INET;
if (bind(sock,(sockaddr*)&in,sizeof(in))==SOCKET_ERROR)
{
//SayWhatError
return 0;
}
if (listen(sock,maxcon)==SOCKET_ERROR)
{
//SayWhatError
return 0;
}
return sock;
}
SOCKET TCPAccept(SOCKET lima)
{
SOCKET accsock;
accsock=accept(lima,NULL,NULL);
if (accsock==INVALID_SOCKET)
{
//SayWhatError
return 0;
}
return accsock;
}
SOCKET TCPConnect(char* ip,int port)
{
sockaddr_in in;
in.sin_port=htons(port);
in.sin_addr.s_addr=inet_addr(ip);
in.sin_family=AF_INET;
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (connect(sock,(sockaddr*)&in,sizeof(in))==SOCKET_ERROR)
{
SayWhatError();
return 0;
}
return sock;
}
void TCPSend(SOCKET sock,char* data)
{
send(sock,data,strlen(data),0);
}
char* TCPRecv(SOCKET sock,int maxlength)
{
char* buff=new char[maxlength+1];
recv(sock,buff,maxlength,0);
return buff;
}
char* TCPNameToIP(char* unresolvedIP)
{
char *IPResolved = "";
LPHOSTENT Host;
Host = gethostbyname(unresolvedIP);
if (!Host)
{
SayWhatError();
return 0;
}
else
{
struct in_addr *address = (struct in_addr *) Host->h_addr_list[0];
IPResolved = inet_ntoa(*address);
}
return IPResolved;
}
void TCPCloseSocket(SOCKET sock)
{
closesocket(sock);
}
void TCPShutdown()
{
WSACleanup();
}
char* cat(char* c1,char* c2)
{
char* c=new char[strlen(c1)+strlen(c1)];
strcpy(c,c1);
strcat(c,c2);
return c;
}
void SayWhatError()
{
try
{
LastError();
}
catch(Error e)
{
MessageBox(0,e.meldung,cat("Errorcode: ",e.errcode),MB_OK|MB_ICONERROR);
return;
}
MessageBox(0,"Unbekannter Fehler!","Fehler!",MB_OK|MB_ICONERROR);
}
void LastError()
{
int code=WSAGetLastError();
throw Error(const_cast<char*>(code==WSANOTINITIALISED?"TCP ist nicht initialisiert (TCPStartup)":(code==WSAECONNREFUSED?"IP nicht erreichbar!":"")),code);
}
Alles anzeigen