18

UDP サーバー/クライアント アプリケーションに取り組んでいます。

クライアントのいずれかがダウンしているかどうかを確認するために、サーバーはハンドシェイク メッセージをクライアントに送信します。次に、サーバーはクライアントの応答を待ってデータを送信し、クライアントがアクティブであることを確認します。このためrecvfrom()、クライアントが応答しない限り、サーバーは への呼び出しでブロックしますが、クライアントがダウンしている場合、サーバーは への呼び出しで無限にブロックしますrecvfrom()

サーバーにそのような機能を実装しrecvfrom()て、特定の時間 (たとえば 2 秒) の呼び出しで待機するようにしたいと考えています。2 秒以内にクライアントからデータを受信しなかった場合、クライアントは停止していると見なされ、recvfrom()戻ります。

それを行う方法はありますか?私はインターネットを検索しましたMSG_DONTWAITが、データが受信されなかったときにすぐに戻るフラグを設定するなどの解決策を見つけましたが、私の場合、recvfrom()すぐに戻りたくはありませんが、特定の期間データを待機し、その特定の期間データが受信されなかった場合、recvfrom()関数は返す必要があります。

4

1 に答える 1

24

最も簡単な方法はsetsockopt()、問題のソケットの受信タイムアウトを設定するために使用することです。

SO_RCVTIMEOこれに使用されます。

に渡されたソケットにタイムアウトが設定されているrecvfrom()場合、データが受信されていなければ、このタイムアウト後に関数は戻ります。

たとえば、読み取りタイムアウトを 10 μs に設定するには (必要に応じて、によって返される値にエラー チェックを追加しますsetsockopt()):

#include <sys/types.h> 
#include <sys/socket.h>

...

struct timeval read_timeout;
read_timeout.tv_sec = 0;
read_timeout.tv_usec = 10;
setsockopt(socketfd, SOL_SOCKET, SO_RCVTIMEO, &read_timeout, sizeof read_timeout);

Windows の詳細については、こちらを参照してください。Linux の詳細については、こちらおよび/またはこちら (POSIX)を参照してください。

于 2013-04-11T06:21:19.503 に答える