0

クライアントソケット接続を受け入れるサーバーソケットがあります。受け入れはスレッドにあります

ソケットの作成

int ServerSocket::CreateSocket(int port)
{
listenfd = 0;
struct sockaddr_in serv_addr; 
unsigned long iMode = 1;

listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(port); 


ioctlsocket(listenfd, FIONBIO, &iMode);

if (bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
    return 0;
}

if (listen(listenfd, 20) < 0)
{
    return 0;
}

return listenfd;
}

ソケット受け入れ

void ServerSocket::AcceptClients_1(void * p)
{
struct sockaddr_in  cli_addr;

// get a pointer to the ServerSocket object
ServerSocket * pThis = (ServerSocket *)p;
int iResult, cli_len;
cli_len = sizeof(cli_addr);
struct timeval tv = { 0, 1000 };  
SOCKET s = pThis->GetSocket();
fd_set rfds;

FD_ZERO(&rfds);
FD_SET(s, &rfds);

while (!pThis->ShutDownRequested)
{
   iResult = select(s+1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
   if(iResult > 0)
   {
         // never comes here
         SOCKET sclient =  accept(s, (struct sockaddr *)&cli_addr, 
                            &cli_len);
    }
   else if (iResult == 0)   /// timeout
   {
        continue;
   }
   // error comes here are going to accept 2nd time
   DWORD dwError = GetLastError();
   return;
 }  
}

コードは select() にあります。最初は 0 を返しますが、2 回目はエラー 10022 で常に -1 を返します。理由がわかりません。助けてください。

4

2 に答える 2

0

iResult=0 は必ずしもタイムアウトを意味するわけではありません。非ブロッキング ソケットの場合は、WSAGetLastError を確認し、いくつかのエラー コードに対処する必要があります。たとえば、WSAEWOULDBLOCK は、このソケットで次のイベントを待つ必要があることを意味します。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

于 2013-08-19T12:30:08.160 に答える
0

pThis->GetSocket()が正しく返されていることを確認してくださいlistenfdcli_len = sizeof(cli_addr);また、各呼び出しの前に再初期化する必要がありますaccept(これは値と結果の引数です)。

于 2013-08-19T13:07:47.600 に答える