2011-01-25 8 views
6

クライアントがselectを待っている間にサーバーがソケットを書き込む理由は何ですか?selectを使用してクライアントソケットのデータを待機する

ソケット間の通信にcを使用しています。私のクライアントは私のサーバーに正常に接続します。

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor 
client->address.sin_addr.s_addr = inet_addr(ipAddress); 
client->address.sin_family = AF_INET; 
client->address.sin_port = htons(port); 

bind(socket_desc,&address,sizeof(address)); 
connect(socket_desc, &address, sizeof(address)); 

私がデータをブロックして聴くことにrecvを使用すると、すべてが正常に動作します:

int bytesRead = 1; 
while(bytesRead){ 
    int bufsize=1024;   
    char *buffer=malloc(bufsize); 
    bytesRead = recv(socket_desc, buffer, bufsize, 0); 
    printf("CLIENT RECV: %s", buffer); 
} 

私は選択を使用しようとすると、すべてのデータを読み込むようには見えません。 STDINをfd_setに追加すると、強制的にソケットから読み取ることができますが、selectはsocket_descのデータ読み込みからトリガーされないようです...?

int running = 1; 
while(running){ 
    /* wait for something to happen on the socket */ 
    struct timeval selTimeout; 
    selTimeout.tv_sec = 2;  /* timeout (secs.) */ 
    selTimeout.tv_usec = 0;   /* 0 microseconds */ 
    fd_set readSet; 
    FD_ZERO(&readSet); 
    FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading 
    FD_SET(socket_desc, &readSet);//tcp socket 

    int numReady = select(3, &readSet, NULL, NULL, &selTimeout); 
      //IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD 
    if(numReady > 0){ 
     char buffer[100] = {'\0'}; 
     int bytesRead = read(socket_desc, &buffer, sizeof(buffer)); 
     printf("bytesRead %i : %s", bytesRead, buffer); 
     if(bytesRead == 0){ 
      running = FALSE; 
      printf("Shutdowning client.\n"); 

     } 
    } 

答えて

8

選択するための最初のパラメータは、だからあなたの場合には、それは

socket_desc+1 

あるべき最大のソケットIDをプラス1する必要がありますあなたはそれを試してみて、それが動作するかどうかを確認することはできますか?

キーボードのキーを押したときにのみ表示されるのは、stdinが0で、チェックされている範囲の0〜(3 - 1)の範囲にあるためです。最初のパラメータをsocket_desc + 1に設定した場合、0 - (socket_desc)の範囲で準備完了ソケットがチェックされます

+1

また、複数のソケットを選択する場合は、FD_ISSET – vmpstr

+0

それはそれをしました。私は気が気になりません。 FD_ISSETが次にあります。 – joels

関連する問題