2017-02-27 4 views
2

私はselectを使用して2つのソケットから読み取っていますが、各ソケットから1つのメッセージしか送信しません。選択は決してタイムアウトしないようですが、常に同じメッセージを1つまたは2つ返します。 whileループを実行するたびにselectパラメータをリセットします。ここでSelectは常にデータを返します

は私のコードです:

while(1) 
{ 
    FD_ZERO(&master); 
    for (i = 0; i < fdmax; i++) 
    { 
     FD_SET(sock_list[i], &master); 
    } 
    tv.tv_sec = 1; 
    tv.tv_usec = 300; 

    int sel = select(fdmax, &master, NULL, NULL, &tv); 
    if (sel > 0) 
    { 
     for (i = 0; i < fdmax; i++) 
     { 
      if (FD_ISSET(i, &master)) 
      { 
       recv_msg(i, buf); 
       print("msg from %d: %s %d %d\n", i, buf, sel, tv.tv_sec); 
      } 
     } 
    } 
} 

誰もが私の選択に問題があることを見ていますか?

+0

を問題があります'recv_msg'のほうがデータを読むことが決してないので、' recv_msg'の可能性が高いです。したがって、 'select'は利用可能なデータを示しています – Kninnug

+0

しましたrecv_msgが機能することを確認しますか? – pm100

+0

'recv_msg'の戻り値をチェックしません。ソケットが閉じているか、読み取りエラーがあるかどうかを確認します。それらのソケットを閉じ、あなたのリストからそれらを削除します。 – jxh

答えて

1

select()の最初のパラメータは、ソケット値+1の数ではなく、最も高いソケット値よりも1高い値です。

それのように最初のパラメータを記述するために 'OK' である:

select(FD_SETSIZE+1, ....); 

この行を:

if (FD_ISSET(i, &master)) 

が正しいことを確認していない提案:

if (FD_ISSET(sock_list[i], &master)) 
関連する問題