2010-12-31 7 views
1

2つの接続を受け付け、それぞれのソケットでファイルディスクリプタセットを作成し、それを選択に渡すコードがあります。しかし、selectが返ってくると、ファイルディスクリプタセット内のファイルディスクリプタの数は1に減らされ、selectはfd_array配列の最初のソケットの受信データを検出するだけです。ソケットセレクションでファイルディスクリプタセットのソケット数を減らす

私はどこを見なければならない?事前に

おかげで、選択機能のreadfds、writefdsおよびexceptfdsの偶然には、/アウト偶然にしている仕様です

アンドレ

 
fd_set mSockets; 

/* At this point 

mSockets.fd_count = 2 
mSockets.fd_array[0] = 3765 
mSockets.fd_array[1] = 2436 

*/ 

select(0, & mSockets, 0, 0, 0); 

/* At this point 

mSockets.fd_count = 1 
mSockets.fd_array[0] = 3765 
mSockets.fd_array[1] = 2436 

*/ 

答えて

3

あなたは選択するように各呼び出しの前にFD_SETを初期化する必要があります。

SOCKET s1; 
SOCKET s2; 

// open sockets s1 and s2 

// prepare select call  
FD_ZERO(&mSockets); 
FD_SET(s1, &mSockets); 
FD_SET(s2, &mSockets); 

select(0, &mSockets, 0, 0, 0); 

// evaluate select results 
if (FD_ISSET(s1, &mSockets)) 
{ 
    // process s1 traffic 
} 


if (FD_ISSET(s2, &mSockets)) 
{ 
    // process s2 traffic 
} 

さらにCOUは、選択の戻り値をチェックすることができます。あなたがソケットで操作することができれば無効であることを示します。私。

readfds、writefdsおよびexceptfdsはまた、選択機能のうち偶然にあるので、それらが修正される:ゼロ復帰は、すべてのFD_ISSETのamcrosが0

EDITを返すこと、を示しています。 fd_countメンバーは、有効なfd_arrayメンバーの数を示します。 fd_countが2未満の場合は、fd_array[1]を評価しないでください。

+0

実際、mSocketsはFD_ZEROとFD_SETを使用して同じように正しく設定されています。問題は、selectがfd_countフィールドを2から1に減らしていることです。なぜそれが起こっているのかわかりません。 –

+0

ところで、このコードはWindowsマシン上で実行されています。 –

関連する問題