6

次のような一定の間隔でUDPパケットをサーバーに送信するプログラムを作成しています。

while (!stop) {
    Sleep(fixedInterval);

    send(sock, pkt, payloadSize, flags);
 }

ただし、 はブロック呼び出しであるため、周期性は保証できませんsend(たとえば、fixedIntervalis が 20ms で、sendis > 20ms の場合)。sendをノンブロッキング操作に変える方法を知っていますか?

4

4 に答える 4

13

ノンブロッキング ソケットを使用する必要があります。送受信関数は、ブロッキングまたはノンブロッキング操作の同じ関数ですが、ソケット自体をノンブロッキングに設定する必要があります。

u_long mode = 1;  // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);

また、ノンブロッキング ソケットでの作業はまったく異なることに注意してください。WSAEWOULDBLOCK エラーを成功として処理する必要があります。:)

したがって、ノンブロッキング ソケットを使用すると役立つ場合がありますが、正確な期間は保証されません。この単純なループではなく、タイマーからこれを駆動することをお勧めします。これにより、ノンブロッキング モードであっても、send の呼び出しによる遅延がタイミングに影響しなくなります。

于 2013-06-21T03:57:41.723 に答える
3

API ioctlsocket でできます。以下のように使えます。しかし、winsock で I/O モデルを使用しないのはなぜですか

ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);

于 2013-06-21T03:36:22.577 に答える
-1

Send にかかった時間を測定して、20ms までの時間をスリープさせてみませんか?

于 2013-06-21T13:02:04.880 に答える