WIN32套接字API:使用基于事件的完成通知取消套接字上的发送/接收

时间:2012-05-24 18:13:41

标签: c++ sockets recv cancellation overlapped-io

使用带有重叠操作的套接字选择基于事件的完成通知; 有2个事件,一个用于数据,另一个用于取消长发/接收:

 HANDLE events[] = { m_hDataEvent, m_hInterruptEvent };

然后调用WSASend,

 WSASend(m_Socket, &DataBuf, 1, NULL, 0, &SendOverlapped, NULL);

接着是

 WSAWaitForMultipleEvents(2, events, FALSE, INFINITE, FALSE);

设置为在任何一个发出信号的事件上返回。 现在假设发送正在进行中,并发出m_hInterruptEvent信号。 WSAWaitForMultipleEvents返回,从技术上讲,调用send的函数也可以返回并删除内部分配的缓冲区。

我不清楚,WSASend可能仍在后台运行,删除缓冲区会导致数据损坏。

如果套接字需要立即用于其他内容,那么停止后台发送/接收的正确方法是什么?

我查看了CancelIO(),但是MSDN从未提及它与套接字有关,它是否仅适用于基于文件的IO?

1 个答案:

答案 0 :(得分:1)

尝试在发送后取消它是没有意义的。即使你成功了,你也会遇到问题,因为接收应用程序不会知道传输被中断了。您的新邮件将被误认为是旧邮件的结尾。

如果您觉得需要取消长发,您应该查看您的应用程序设计。

  • 以块的形式发送并检查块之间的取消。确保您有一种与接收器通信的方式,即传输已被取消。
  • 关闭套接字以取消。再次,确保客户端有办法知道这是一个中断的传输(例如,如果客户端事先知道总长度,他们将识别中断的传输)。
  • 等待它在后台取得成功,不要担心。如果您有紧急消息,请为它们使用单​​独的连接。

针对您的特定问题 “停止后台发送/接收的正确方法是什么,如果套接字需要立即用于其他内容” ,答案是:套接字便宜 - 只需使用两个 - 一个用于慢速传输另一个用于紧急消息。