使用带有重叠操作的套接字选择基于事件的完成通知; 有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?
答案 0 :(得分:1)
尝试在发送后取消它是没有意义的。即使你成功了,你也会遇到问题,因为接收应用程序不会知道传输被中断了。您的新邮件将被误认为是旧邮件的结尾。
如果您觉得需要取消长发,您应该查看您的应用程序设计。
针对您的特定问题 “停止后台发送/接收的正确方法是什么,如果套接字需要立即用于其他内容” ,答案是:套接字便宜 - 只需使用两个 - 一个用于慢速传输另一个用于紧急消息。