我觉得我有问题。我有两个相互连接的 TCP 应用程序,它们使用 winsock I/O 完成端口来发送/接收数据(非阻塞套接字)。
一切正常,直到出现数据传输突发。发件人开始发送不正确/格式错误的数据。
我在堆栈上分配要发送的缓冲区,如果我理解正确,那是错误的做法,因为这些缓冲区应该在我发送它们时保留,直到我从 IOCP 收到“写入完成”通知。
以此为例:
void some_function()
{
char cBuff[1024];
// filling cBuff with some data
WSASend(...); // sending cBuff, non-blocking mode
// filling cBuff with other data
WSASend(...); // again, sending cBuff
// ..... and so forth!
}
如果我理解正确,这些 WSASend() 调用中的每一个都应该有自己唯一的缓冲区,并且只有在发送完成时才能重用该缓冲区。
正确的?
现在,我可以实施哪些策略来维护大量此类缓冲区,我应该如何处理它们,如何避免性能损失等?
而且,如果我要使用缓冲区,这意味着我应该将要从源缓冲区发送的数据复制到临时缓冲区,因此,我会将每个套接字上的 SO_SNDBUF 设置为零,这样系统就不会重新复制我的内容已经复制了。你和我在一起吗?如果我不清楚,请告诉我。