Big_Bertinator
Grünschnabel
Hallo,
Ich habe ein Problem mit meinem Winsock. Ich habe nun schon lange im Internet rumgesucht, aber nicht wirklich das Passende gefunden.
Ich habe einen Server, der mehrere Clients verwaltet, dass Problem ist nur dass er bei dem Befehl recv wartet. Dies ist ja auch richtig, aber leider nicht gut bei einem Server mit mehreren Clienten. Ich habe mal gelesen, dass man für jeden Clienten einen eigenen Theard starten muss, aber gibt es da nicht eine bessere Möglichkeit?
Der Code ist aus meiner eigenen Header Datei, mit der ich mein winsock vereinfache.
Ich hoffe ihr könnt mir helfen.
Ich habe ein Problem mit meinem Winsock. Ich habe nun schon lange im Internet rumgesucht, aber nicht wirklich das Passende gefunden.
Ich habe einen Server, der mehrere Clients verwaltet, dass Problem ist nur dass er bei dem Befehl recv wartet. Dies ist ja auch richtig, aber leider nicht gut bei einem Server mit mehreren Clienten. Ich habe mal gelesen, dass man für jeden Clienten einen eigenen Theard starten muss, aber gibt es da nicht eine bessere Möglichkeit?
Der Code ist aus meiner eigenen Header Datei, mit der ich mein winsock vereinfache.
PHP:
int wserverMULTISTART(int cyrobat_wserver_port)
{
cyrobat_wserver_startServer(cyrobat_wserver_port);
for(int cyrobat_wserver_i=0;cyrobat_wserver_i<MAX_CLIENTS;cyrobat_wserver_i++)
{
cyrobat_wserver_clients[cyrobat_wserver_i]=INVALID_SOCKET;
}
_beginthread(cyrobat_wserver_theardad, 0, NULL);
}
void cyrobat_wserver_theardad(void *)
{
char cyrobat_wserver_clientnum[50];
while(cyrobat_wserver_stat==1)
{
for(int cyrobat_wserver_i=0;cyrobat_wserver_i<MAX_CLIENTS;cyrobat_wserver_i++)
{
if(cyrobat_wserver_clients[cyrobat_wserver_i]==INVALID_SOCKET)
{
cyrobat_wserver_clients[cyrobat_wserver_i]=accept(cyrobat_wserver_acceptSocket,NULL,NULL);
if(cyrobat_wserver_stat==0){break;}
if(cyrobat_wserver_clients[cyrobat_wserver_i]==INVALID_SOCKET)
{
log<<"#>Fehler: accept, fehler code: "<<WSAGetLastError()<<"\n";
}
else
{
log<<"#>Neuer Client hat die Nummer: "<<cyrobat_wserver_i<<"\n";
sprintf(cyrobat_wserver_clientnum, "%d", cyrobat_wserver_i);
wserverMULTISEND(cyrobat_wserver_clientnum,cyrobat_wserver_i,false);
}
if(cyrobat_wserver_stat==0){break;}
}
}
}
}
int wserverMULTIGET(char* buf, int cyrobat_wserver_client, bool cyrobat_wserver_wait)
{
if(cyrobat_wserver_wait==true)
{
while(cyrobat_wserver_clients[cyrobat_wserver_client]==INVALID_SOCKET)
{
Sleep(100);
}
}
cyrobat_wserver_rc=recv(cyrobat_wserver_clients[cyrobat_wserver_client],buf,SIZE_STRING,0);
if(cyrobat_wserver_rc==0 || cyrobat_wserver_rc==SOCKET_ERROR)
{
if(cyrobat_wserver_wait==true){log<<"#>Fehler: recv, fehler code: "<<WSAGetLastError()<<"\n";}
if(WSAGetLastError()!=10038){cyrobat_wserver_clients[cyrobat_wserver_client]=INVALID_SOCKET;}
return 1;
}
else
{
buf[cyrobat_wserver_rc]='\0';
return 0;
}
}
Ich hoffe ihr könnt mir helfen.