呵呵,是不是听起来很傻?我使用从CSocket派生出来的类进行编程,客户端只设一个CSocket对象,设置定时器向各个服务器轮流发送请求是没有问题的,因为有延时吧,可以比较从容的处理数据可是当我使用for循环迅速的查询数据的时候,问题就出现了,系统只返回最后一个服务器的数据,代码大致如下:for(...)
{ m_sConnectSocket.Close();
m_sConnectSocket.Create();
if(!m_sConnectSocket.Connect(SvrAdd,ServerPort))
{
//记录错误日志
//AfxMessageBox(str);
}
int nSend = m_sConnectSocket.Send(reqStr,reqStr.GetLength()); 
if(nSend==SOCKET_ERROR)
{
//记录错误日志
//AfxMessageBox("error");
}
}
然后在OnReceive()函数中处理,但已经接受不到前面的服务器的信息了问题也很明显,就是m_sConnectSocket.Close()导致连接尚未收到数据就被断开,有什么好的方法可以解决这个问题呢?最好不要使用多个客户端连接,只要控制好这一个连接能够顺序接受数据,接受不到放弃然后接受下一个就行。初学socket, 还望各位援手! 100分相送,先完整回答者至少50,再谢!

解决方案 »

  1.   

    可以用线程来解决,一个连接一个线程。或者用一个同步对象来解决,比如,只有我在OnReceive里收到数据后才允许closesocket。for(,,,)
    {
      WaitForSingleObject(...);
      m_sConnectSocket.Close();
    ...
    }
      

  2.   

    对了应该在WaitForSingleObject加上超时(有参数可以设置超时),比如,有可能一直收不到数据。
      

  3.   

    谢谢,可问题是有时候客户端只是想要发个本地请求,收到后不返回数据的,难道也要等待超时?比较不倾向于多个连接,还有别的办法吗?我使用CCriticalSection来lock,在接受到数据的时候unlock,还是不成啊.