c# - C++ socket select() function returns 0 with many connections -
i have code server sends udp message contains tcp port number clients. server waits incoming tcp connections clients. however, select() function returns timeout many connections. can figure out might problem.
any , comments on code below appreciated. in advance help.
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 clients not connected (int = 0; < udp_connections.size(); i++) { // clients not connected if ( tcp_connections[i]->isconnected() ) { continue; } // making 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()); } (int = 0; < 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)); (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 } } } } }
some implementations of select()
update timeout argument, may need reset before each call.
Comments
Post a Comment