2017-04-25 12 views
2

Cソケットのrecvmsg()にキューがある場合、キューにバックログされているアイテムの数はどのようにして調べることができますか?Cでは、ソケットの場合、recvmsg()にキューがありますか?

私の問題は、recvmsg()から何かを受け取った後のコードの速度が、recvmsg()に送信されたデータの速度よりも遅いことがあります。キューが大きすぎるとどうなりますか?

while (recvmsg(SocketA,...) > 0) 
{ 
    ... 
    ...something that takes 1.5 seconds to execute/complete... 
    ... 
} 

とどこかに以下の機能が1秒毎に呼び出される場合:これは私のrecv()のコードであれば

は、例えば

// gets called every 1 second 
int send_to_sock() 
{ 
    ... 
    send(SocketA, ...); 
    ... 
} 

私は(recvmsgのためのリファレンスページを確認しました)しかし、彼らはどれもキューについて何も言及していませんが、私は漸進的に追加する遅延を観察しているので、キューがあるようです。しかし、キューが長すぎるとコードが機能しなくなるので、キューの長さをチェックする方法があるかどうかを知りたい。

+0

なぜあなたは 'recv'の関数定義を持っていますか?通常、 'recv'はOSによって定義されています... –

+0

ソケットにはバッファがあります。それがあなたの言いたいことなら、これはおそらく興味深いでしょう:http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux –

+0

私たちは,,データはあなたとピアの間の空間と時間に広がります。これは、サーバー、クライアント、および中間ルーターにキューイングされています。海底線沿いにあり、地上局と衛星の間の自由空間にあります。そこにデータがありますが、あなたはそれがどこでどれくらいあるか分かりません。 – ThingyWotsit

答えて

2

これはキューではなく、ほとんどのI/Oデバイスに関連するバッファです。ソケットだけでなく、たとえば、stdinからscanfのようなものを読み取ると、enterキーを押すとデータがプログラムに送られます。その間、すべてのキーストロークが保存されていると思いますか?

これらのバッファの具体的な詳細は実装定義ですが、通常、ソケットではバッファがいっぱいになると新しいパケットが破棄されます。バッファの状態のクエリに関する詳細は、How to find the socket buffer size of linuxおよびHow can I tell if a socket buffer is full?にあります。

2

はい。ソケット受信バッファがあります。最大サイズは、SO_RCVBUFオプションを使用してgetsockopt()setsockopt()に設定して設定できます。それがいっぱいになると、TCPの場合、送信者は送信を停止するように指示されます。 UDPの場合、さらに着信データは破棄されます。

関連する問題