在使用WinSock的WSAEventSelect()函数时,什么情况下会收到FD_CLOSE消息?是否接收到对方发的FIN包?若此时缓冲中数据未读完,可以继续读么?
解决方案 »
- 关于生产dump文件,示例用__try和__except将_tmain都包起来了,如果是mfc程序该怎么办呢?
- 看中了一个妞,想泡她,可是她每次赴约总是带着一个女灯泡!怎么让她一个人赴约呀?
- 如何将VC源程序的一部分拆成DLL文件
- 大家帮忙看看,遇到同名文件,自动生成一个新的文件名,这个功能怎么实现。
- 怎么在OpenGL中是实现现实场景图片与虚拟场景图象的融合?
- 关于CString类的奇怪问题,大虾们赐教。
- 如何将窗口启动的时候变为最大化?请教!
- 把二进制字符读入变量中的问题?
- 谁知道hhp文件的格式?
- 一个比较简单的问题......菜鸟提问!!!(关于OLE)
- 绘制窗口问题
- 动态全局数组使用所遇到的问题。
对方关闭了socket或你自己关闭了socket,如果你的socket关联上了FD_CLOSE的话,都会触发到FD_CLOSE消息的.现在只讨论是对方关闭了(如果是你自己关闭的话,当然是你数据都读好了才关闭了).
如果对方在将发送发送完成(send()或WSASend()返回成功结果),就马上关闭socket的话,那么会出现多种情况
1.假设对方发送的数据并不是大得惊人,只是一般的几K到10多KB:
A.当你的数据都接收完后,FD_CLOSE消息才被触发,一般出现在非局域网环境,你到对方的网络环境速度一般时.
B.收到FD_CLOSE消息,但数据还没到达,这最大可能出现是在同一个局部网环境中,或你到对方的网络速度很快时.2.假设对方发送的数据比较大,例如是100KB以上,那么无论在哪种环境,很多机率在收到FD_CLOSE时还没将所有数据接收完.无论是哪种情况,你最保险的方法是在收到FD_CLOSE时,先检查socket中是否还有收据可读,如果无数据可读了,那自然是直接关闭socket了,如果还是有数据可读,那么就继续读,直至socket中没有数据可读后才将socket关闭.