[WinSock]Blokujące tcp?
Ostatnio zmodyfikowano 2017-01-04 19:36
skovv Temat założony przez niniejszego użytkownika |
[WinSock]Blokujące tcp? » 2017-01-04 16:46:21 Witam. Pisze mini-server do gry i mam problem z odbieraniem wiadomości od kilku graczy jednocześnie. 1.Tworzenie servera: ServerSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
#ifndef LINUX u_long iMode = 1; int iResult = ioctlsocket( ServerSocket, FIONBIO, & iMode ); if( iResult < 0 ) err( "Can't setup non-blocking!" );
#else u_long iMode = 1; int iResult = ioctl( ServerSocket, FIONREAD, & iMode ); if( iResult < 0 ) err( "Can't setup non-blocking!" );
#endif
memset( & TcpIN, 0, sizeof TcpIN ); TcpIN.sin_family = AF_INET; TcpIN.sin_addr.s_addr = INADDR_ANY; TcpIN.sin_port = htons( TCP_PORT );
if( bind( ServerSocket,( struct sockaddr * ) & TcpIN, sizeof TcpIN ) == SOCKET_ERROR ) err( "Can't bind port!" );
if( listen( ServerSocket, 1000 ) == SOCKET_ERROR ) err( "Can't listen socket!" );
2. Accept: NewClient = accept( ServerSocket,( struct sockaddr * ) & TcpIN, & length ); if( NewClient != SOCKET_ERROR ) { #ifndef LINUX u_long iMode = 1; int iResult = ioctlsocket( NewClient, FIONBIO, & iMode ); if( iResult < 0 ) std::cout << "Can't setup non-blocking!\n"; #else u_long iMode = 1; int iResult = ioctl( NewClient, FIONREAD, & iMode ); if( iResult < 0 ) std::cout << "Can't setup non-blocking!\n"; #endif }
for( int i = 0; i <( int ) Clients.size(); i++ ) { char buff[ 256 ]; int bytesRecv = recv( Clients[ i ]->Socket, buff, 256, 0 ); }
Ktoś może mi powiedzieć co robię źle, co mogłoby być nie tak? Działa to mniej więcej tak, że przy dwóch graczach odpiera raz od jednego a raz drugiego. |
|
j23 |
» 2017-01-04 19:00:17 Tak się zastanawiam, dlaczego dla wersji linuksowej używasz flagi FIONREAD zamiast użyć FIONBIO? |
|
skovv Temat założony przez niniejszego użytkownika |
» 2017-01-04 19:36:21 No i naprawiłeś mi server.. Taki mały szczegół :) Dziękuję Ci bardzo! :) |
|
« 1 » |