当当前没有接收时,传入数据会发生什么
what happens to incoming data, when there is no wsarecv at the moment
我在windows多线程IOCP服务器上工作。为了避免处理许多挂起的读,我总是在每个连接的套接字上只有一个wsarecv
操作。简而言之,我的设计看起来像:
- 客户端连接后,
wsarecv
被发送到已连接的套接字上 - 当
wsarecv
被执行时,数据被处理,wsasend
被发送到同一个套接字 - 当
wsasend
从步骤2完成(GQCS收到通知),wsarecv
再次发布。
这意味着在步骤2和步骤3之间有一小段时间,当没有挂起的wsarecv等待客户端数据时,它可以在任何时间出现。
是这种情况,我应该担心,或者我可以假设,如果数据会到达这个特定的少量时间,它将被存储在某种内部缓冲区中,并在wsarecv
从步骤3发布的那一刻从它取出?
只要你没有禁用网络堆栈的缓冲(使用SO_RCVBUF
并将缓冲区大小设置为0),那么你将在网络堆栈中有一些缓冲空间,如果你没有WSARecv()
挂起,这将被使用。
如果你正在使用TCP,那么你甚至不必担心何时填满这个缓冲区空间,因为这将导致零窗口,并且发送方将希望停止发送(请参阅这里为什么它可能不会真正停止发送),但即使它不这样做,那么你的堆栈将简单地丢弃后续数据报,TCP最终将重新发送它们。
UDP有点不同。如果你填满了recv缓冲区,那么你将开始删除数据报。默认情况下,堆栈会丢弃最新的数据报,你可以通过设置SIO_ENABLE_CIRCULAR_QUEUEING
来改变这一点,这将导致最老的数据报被丢弃。
你可以选择总是有至少一个WSARecv()
挂在连接上a)发布一个以上的开始和b)发布一个新的作为你做的第一件事当一个完成。这对UDP工作得很好,但对TCP来说,这种方法的问题是,你必须允许多个recv可以"同时"完成,然后你必须确保你的I/O线程一起工作,以保持TCP数据流同步(见这里的问题)。
禁用堆栈的recv缓冲区并始终在连接上挂起足够的WSARecv()
可能会更高效,因为这将从入站数据路径中删除内存副本。
- 通过JNI传递数据数组的最快方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在C++中查找像素 RGB 数据的最快方法是什么?
- C++中deque数据结构的大O是什么?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 自定义数据结构的优点是什么?
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- DLL共享数据的推荐方式是什么
- 对于单个数据 WORD 的 memcpy 和赋值语句有什么区别?
- 在C++中,运算符 sizeof 返回什么数据类型?
- 什么是 DirectX 9 中的数据流?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?