2011-02-09 2 views
1

サーバーがクライアントにTCPポート番号を含むUDPメッセージを送信するコードがあります。次に、サーバーは、クライアントとのTCP接続を待ちます。ただし、select()関数は多くの接続でタイムアウトを返します。私は何が問題かもしれないか把握することができます。C++のsocket select()関数は、多くの接続で0を返します。

以下のコードに関するご意見やご感想は大変ありがとうございます。事前におかげで助けてください。 select()更新彼らのtimeout引数の

void initialise(void) 
{ 

    m_tcp_listensocket = getlistensocket(); 
    highsock = m_tcp_listensocket; 

    setnonblocking(m_tcp_listensocket); 
    struct timeval timeout; 
    timeout.tv_sec = m_timeout; 
    timeout.tv_usec = 0; 


    // Send UDP messages to clients not connected 
    for (int i = 0; i < UDP_Connections.size(); i++) 
    { 
     // Only to clients not connected 
     if (TCP_Connections[i]->IsConnected()) 
     { 
     continue; 
     } 

     // making the message: 'server_address:server_port'. 
     char l_str_server_port_number[6]; 
     sprintf (l_str_server_port_number, "%d", TCP_Connections[i]->get_server_port_number()); 

     struct hostent *host; 

    if((host = gethostbyname(m_host_name)) == NULL) 
    { 

     // gethostbyname() made error 
    }  
     struct in_addr MyAddress; 
     memcpy(&MyAddress.s_addr, host->h_addr_list[0], sizeof(MyAddress.s_addr)); 

     std::string l_str_init_message = std::string(l_str_server_port_number) + "\0"; 

     UDP_Connections[i]->sendUDPMessage(l_str_init_message.c_str()); 
    } 

    for (int i = 0; i < TCP_Connections.size(); i++) 
    { 
     struct sockaddr_in clientaddr; 
     bzero(&clientaddr, sizeof(clientaddr)); 
     clientaddr.sin_family = AF_INET; 
     clientaddr.sin_addr.s_addr = htonl(INADDR_ANY); 

     fd_set readSet; 
     FD_ZERO(&readSet); 
     FD_SET(m_tcp_listensocket, &readSet); 

     int readsocks = select(highsock+1, &readSet, NULL, NULL, &timeout); 

     switch (readsocks) 
    { 
    case 0: 
     /* timeout */ 
     break; 

    case -1: 
     /* error */ 
     break; 

    default: 
     if (FD_ISSET (m_tcp_listensocket, &readSet)) 
     { 
      socklen_t tempo = (socklen_t)sizeof(clientaddr); 

      int l_Socket = accept(m_tcp_listensocket, (struct sockaddr *)&clientaddr, &tempo); 
      if (l_Socket > highsock) 
     highsock = l_Socket; 

      if (l_Socket >= 0) 
     { 
      // connection accepted 

      char adr[16] ; 
      inet_ntop(PF_INET,&clientaddr.sin_addr, adr, sizeof(adr)); 

      for (int j= 0; j < UDP_Connections.size(); j++) 
      { 

       if (UDP_Connections[j]->get_clientIP() == (std::string)adr) 
      {  
       TCP_Connections[j]->set_TCPsocket(l_Socket); 
       break; 
      } 
      } 

     } 
      else 
     { 
      // socket error 
     } 
     } 
    } 
    } 
} 

答えて

3

いくつかの実装では、各呼び出しの前にこれをリセットする必要があるかもしれません。

+0

ありがとうございます。これは注意を払うのが良い点ですが、問題は解決しません。多くのクライアントがTCP接続を確立しようとしているときに、select()によってタイムアウトが返されます。 – user609823

関連する問題