我应该等多少,直到套接字的发送缓冲区为空



我试图限制只有一个接收器的网络。

首先,我通过以下方式检测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()所需的时间,以便重新清空发送缓冲区(以最佳方式)?

附言请不要告诉我等待任意时间(例如usleep(10000);

如果要以最大速率发送,write应在需要时默认阻止。一旦write返回,它就完成了你的sendBuffer,你可以把下一个数据块放进去,然后再次调用write

如果您将套接字设置为非阻塞,您只需要弄乱select,在这种情况下,您等待的条件是 socet 是可写的。

相关内容

  • 没有找到相关文章

最新更新