问题描述:前一段时间写了一个基于socket的网络程序(B/S模式,应答通讯),使用的是MFC的异步socket类(CAsyncSocket),debug模式下可以正常通讯,打包发布后发现通讯总是失败,在网上查到的资料是debug模式和release模式,只有在编译诊断,和编译效率上有区别。后来借助网络调试助手查看传输数据并调试程序,逐渐缩小了问题范围:
m_pMySocket->Connect()后, 接着直接发送数据m_pMySocket->Send()返回-1(无连接)。
问题到了这里我就在想,是否是因为socket是异步(执行后不等待立即返回)的原因Connect()后立即返回,我就直接去用socket连接句柄直接发送数据Send()的原因造成的,连接服务器是需要时间的(虽然很短),在没有连接上时就去发送数据肯定是不会成功的。事实证明了我的猜想是正确的(虽然之前我经历了无数错误的猜想)
解决办法:在m_pMySocket->Connect()后,添加一个SetTimer(1,100,NULL);时钟 不停轮询判断OnConnect(int nErrorCode)是否响应,(记得要进行超时处理)。必须要等到Socket成功连接之后才能去发送数据。