1

私はCでソケットプログラミングプロジェクトを実装しています。使用しています

選択する()

クライアントからのデータを待機します。2つのUDPソケットがあり、select呼び出しは常に私のソケットの1つを無視しています。誰かがそれをどこから探し始めるべきか簡単に説明できますか?これは私のサーバーが行っていることです

waitThreshold.tv_sec = 5000; 
waitThreshold.tv_usec = 50; 
if(sd > sd1)    
    max_sd = (sd + 1);
else if(sd1 > sd)   
    max_sd = (sd1 + 1);
FD_ZERO(&read_sds); 
FD_SET(sd, &read_sds); 
FD_SET(sd1, &read_sds);


ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
if(ret <0)
{
    printf("\nSelect thrown an exception\n");   
    return 0;
} 
else if(FD_ISSET(sd, &read_sds)) 
{
    // code for socket one
} 
else if(FD_ISSET(sd1, &read_sds)) 
{
    // code for socket two
}
4

2 に答える 2

2

あなたが書いelse ifたので、そのうちの1つだけが実行されます。

于 2013-03-23T22:09:11.313 に答える
0

一般的に言えば、select() を使用して複数のソケットをプールする場合、IF でコードを分岐する代わりに for ループを使用する必要があります。また、select は fd_set 引数 (読み取り、書き込み、およびエラー ファイル記述子セット - 2 番目、3 番目、および 4 番目の引数) を変更し、各 select() の前にそれらを再設定する必要があることに注意してください。複数の同時接続で読み取るデータを持つソケットを選択するための非常に一般的なコード レイアウトは、次のようになります。

FD_ZERO(&master_sds);
FD_ZERO(&read_sds);

for (i=0; i<number_of_sockets); i++){
    FD_SET(sd[i], &master_sds);
    if sd[i] > max_sd {
        max_sd=sd[i];
    }
}

for(;;){
    read_sds=master_sds;
    ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold);
    if(ret<0){
        printf("\nSelect thrown an exception\n");
        return 0;
    }
    for(i=0; i<max_sd; i++){
        if FD_ISSET(sd[i], &read_fds){
            // code for socket i
        }
    }   
}

データ用のソケットをプールするために無限ループを使用したくない場合があります。ソケットの 1 つで特定のデータを受信したり、特定のユーザー入力を終了条件として受信したりするなどの条件を挿入できます。お役に立てれば。

于 2013-04-21T14:51:41.367 に答える