【问题标题】:Winsock2 data loss when in debugger在调试器中时 Winsock2 数据丢失
【发布时间】:2011-06-10 14:22:51
【问题描述】:

我将 Winsock2 与重叠 I/O 结合使用。这意味着我用 WSAOVERLAPPED 结构调用 WSARecv,然后我用 WSAWaitForMultipleEvents 等待数据。

我做了一个奇怪的观察,当我用调试器停止它时,我似乎丢失了发送到我的应用程序的任何数据。我认为这些数据会堆积在操作系统的某个地方,然后在下次调用 WSARecv 时传递。

我的假设是错误的吗?

【问题讨论】:

  • 代码中的其他地方一定有一些错误,你描述的情况不应该产生那个错误,并且如果没有传递给你的程序,操作系统中的某个地方会堆积数据。但是操作系统本身也有一些限制,不知道如果溢出会怎样。
  • 我进行了进一步调查,发现数据堆积在调试器中与 WSAOVERLAPPED 关联的缓冲区中。我似乎没有收到任何有关此数据的事件。当接收到下一个数据块时,缓冲区会被简单地覆盖,我可能会看到新数据的事件。真的很奇怪。

标签: c++ winsock winsock2 overlapped-io


【解决方案1】:

UDP 还是 TCP?

我假设您每次调用都使用单独的 OVERLAPPED 结构,每个结构使用单独的事件。

请记住,将重叠 I/O 与事件一起使用并不是特别可扩展,将套接字与 I/O 完成端口相关联并完全跳过整个事件会更容易。

【讨论】:

  • 它用于 TCP。我 ZeroMemory 是使用后的重叠结构,我 WASResetEvent 也是使用的事件。奇怪的是,它在不被调试器暂停时工作正常。那么不应该出现关于滥用事件/重叠结构的任何错误吗?
  • 是的,但是调试器可能会导致任何竞争条件更频繁地出现...我们可以看看一些代码吗?
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 2012-12-03
  • 2019-08-12
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多