我试图限制只有一个接收器的网络。
首先,我通过以下方式检测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 是可写的。