我试图限制仅一个接收器的网络。
首先,我通过以下方法检测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
如果您将套接字设置为非阻塞状态,则只需要弄乱就可以了,在这种情况下,您要等待的条件是套接字是可写的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句