0

受信機が 1 つだけのネットワークを調整しようとしています。

まず、次の方法で SO_SNDBUF のサイズを検出します。

getsockopt(sendsockfd, SOL_SOCKET, SO_SNDBUF, &sndBufferSize, &sbsLen);

次に、次のようにして完全にいっぱいになるまで、このバッファーをいっぱいにし続けます。

if (sndBufferSize - NbBytesInBuffer >= HEADER){
    memcpy (sendBuffer + NbBytesInBuffer, &buf_header, HEADER);
    NbBytesInBuffer +=HEADER;
}

もちろん、コードの関連部分だけを言及しています。

最後に、バッファがいっぱいになったら、ソケットに書き込みます。

if (sndBufferSize - NbBytesInBuffer < HEADER)
sentSize = write(sendsockfd,sendBuffer,NbBytesInBuffer);
...

私の問題はまだ言及されていません。上記のものはすべて、データを再送信するまで完全に機能しています。

ここで、可能な限り最大の速度で送信したいので、待機時間をできるだけ短くする必要があります。(つまり、送信バッファが空になるとすぐに再送信する必要があります)。

write()(最も最適な方法で) 送信バッファを再度空にするために必要な時間を検出する方法は?

PS任意の時間待つように言わないでください(たとえばusleep(10000);

4

1 に答える 1

3

最大レートで送信したい場合は、write必要に応じてデフォルトでブロックする必要があります。write返されるとすぐに、それはあなたsendBufferで行われ、次のデータブロックを入れてwrite再度呼び出すことができます。

selectソケットを非ブロックとして設定する場合にのみ、いじる必要があります。その場合、待っている状態は、ソケットが書き込み可能であることです。

于 2014-12-28T03:04:04.413 に答える