0

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

首先,我通过以下方式检测 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 回答