2014-02-13 1 views
0

Select()의 시간 초과 옵션을 NULL로 설정하여 문제가 완전히 해결되었다고 말하면서 머리말을 붙이고 싶습니다.Winsock - Listening 소켓에서 선택 시간 초과로 인해 모든 후속 Select 호출이 실패 함

하지만 시간 제한을 사용하고 싶습니다. 여기 내 문제가 있습니다. 서버 프로그램은 매우 단순한 &이며, 연결을 청취하고이를 받아 들여 콘솔에 인쇄합니다.

문제는 select의 첫 번째 시간 초과 후 select가 -1을 반환한다는 것입니다. MSDN은 select()에서 -1이 반환 될 것이라는 점에 대해 거의 알려주지 않고 오류 만 표시합니다. 신호)를 차단하고 프로그램에서 더 이상 통신을 중단합니다.

서버 - 방법 선택()가 작동하는데, 어떻게 내 클라이언트에서 작동합니다 그게 전부 때문에 MAIN.CPP

int main(){ 

    /* variables */ 
    int iResult, iSendResult; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int recvbuflen = DEFAULT_BUFLEN; 
    bool exit=false; 
    int foundRoom, tempFoundRoom; 
    fd_set readfds, writefds; 
    struct timeval tv; 
    long double counter=0; 
    int maxfd=0; 

    /* Server variables */ 
    WSADATA wsaData; 
    SOCKET ListenSocket = INVALID_SOCKET; 
    SOCKET ClientSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL; 
    struct addrinfo hints; 


    printf("~SERVER~\n"); 

    /* Initialize Winsock*/ 
    initialize_winsock(wsaData, hints, &result); 

    /* Set socket and bind to TCP listening socket */ 
    set_socketandbind(ListenSocket, result, maxfd); 

    //non-blocking mode 
    u_long iMode=1; 
    ioctlsocket(ListenSocket,FIONBIO,&iMode); 
    ioctlsocket(ClientSocket,FIONBIO,&iMode); 

    // clear the set ahead of time 
    FD_ZERO(&readfds); 
    //FD_ZERO(&writefds); 

    //add our descriptors to the set 
    FD_SET(ListenSocket, &readfds); 

    //wait until either socket has data ready to be recv()d (timeout 5 secs) 
    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    /* main loop */ 
    for(;;){ 
     cout << "Maxfd: " << ListenSocket << " \ " << maxfd << endl; 

     //select 
     int rv = select(ListenSocket+1, &readfds, NULL, NULL, &tv); 

     cout << "Updateing... rv: " << rv << endl; 

     if (rv == -1) { 
      perror("Select: "); // error occurred in select() 
     }else if (rv == 0){ 
      printf("Timeout occurred! No data after 5 seconds.\n"); 
     }else{ 

      // one or both of the descriptors have data 
      if (FD_ISSET(ListenSocket, &readfds)) { 

       // Accept a client socket 
       ClientSocket=accept(ListenSocket, NULL, NULL); 

       cout << "Connected a user." << endl; 

      } 

      counter++; 
     } 

     cout << endl; 
     Sleep(500); 

    }; 

    /* Unset server socket */ 
    closesocket(ListenSocket); 

    system("pause"); 
    return 0; 
} 

출력은해야한다, 시간 제한, 시간 제한, 시간 제한,. 당신은 'TV'와 FD 구조 루프 주위 때마다 재설정해야

enter image description here

답변

4

대신 출력은 타임 아웃, 오류, 오류, 오류입니다.

+0

select()를 호출 할 때마다 TV 구조가 다시 설정된다는 것을 의미합니까? –

+0

이것은 실제로 문제를 해결하지 못합니다. FD_ZERO 및 FD_SET을 추가하고 루프에서 tv를 재설정해야하며 모든 루프를 추가 할 필요가 없습니다. 왜 이런거야? –

+1

select()는 FD 구조를 변경하기 때문입니다. 시간 제한이있는 경우 아무 것도 준비되지 않았으므로 해당 비트가 지워졌으므로 재설정해야했습니다. – EJP

관련 문제