线程终止、请求丢失。

今天写一个小程序,当接收到指定消息时,创建一个SOCKET去连接指定主机,一旦接通,就向主机发送、以及从主机取回一些数据。为了避免阻塞,每当需要连接主机的时候,就创建一个线程,在该线程里调用connect(),连接成功后就用send()发送一些数据,紧接着调用WSARecv()发起一个overlapped的异步取请求,然后线程退出。
结果是,负责监视完成端口的线程,根本取不到数据,只是收到一个SOCKET断开的事件。没办法,只好单步跟踪,奇怪的是,单步跟踪时居然一切正常,该发送的数据发送了,该收到的数据也收到了,百思不得其解……加上一些调试信息,发现WSARecv()会返回WSA_IO_PENDING,这个返回值表示重叠IO已提交,但暂时没有还完成……这个返回值也属于正常情况,但偏偏就是收不到数据。< /div>
想起单步跟踪时,一切都正常,而单步跟踪与正常运行的唯一差别,可以说就是单步跟踪时执行每条语句时有延时,于是在WSARecv()前面加上一条Sleep(1000),再运行程序,惊奇地发现数据收到了,而调试信息打印的WSARecv()返回值是 0……
为什么有了延时就会成功呢,左思右想,忽然从脑海深处闪出一条很久以前的记忆:当发起IO请求的线程终止后,该IO请求将被Windows丢弃!心中一阵狂喜,几乎可以肯定就是这个原因了,马上修改代码,用QueueUserWorkItem()并且传递 WT_EXECUTEINIOTHREAD参数来取代自己创建的线程,运行后果然一切正常。

你可能感兴趣的:(windows,socket,IO)