Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinSock]Blokujące tcp?

Ostatnio zmodyfikowano 2017-01-04 19:36
Autor Wiadomość
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:
C/C++
ServerSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

// NonBlocking
#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

// TCP/IP Bind
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!" );

// TCP/IP Listen
if( listen( ServerSocket, 1000 ) == SOCKET_ERROR )
     err( "Can't listen socket!" );


2. Accept:
C/C++
// 1 wątek
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
    // tutaj dodawanie do Clients
}

// 2 wątek
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.
P-155965
j23
» 2017-01-04 19:00:17
Tak się zastanawiam, dlaczego dla wersji linuksowej używasz flagi FIONREAD zamiast użyć FIONBIO?
P-155973
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! :)
P-155976
« 1 »
  Strona 1 z 1