我用TCP协议编写c/s socket。刚开始的时候一切正常,双客户可以同时工作。时间长了以后就出问题了。有个客户就卡住了,没有反应。A客户卡住的时候,点击B客户时B客户卡住了没有反应而A客户得到正确数据不卡了。再点击A客户则A客户卡住,B客户得到正确数据并解卡。这样交替进行。很是奇怪。
我调试了一下。sever在recv的时候得到A客户的SOCKET_ERROR,然后关闭套结字和线程。但是客户端阻塞在recv就没有反应了,卡在这里。当B客户建立连接的时候,sever接受到的是A的内容,然后好像是从A的socket中把数据发走了,所以A客户解卡,B客户取而代之。
代码如下:
sever端:
ret=recv(sock,&recvBuff[idx],nLeft,0);
         if(ret==SOCKET_ERROR)
{
TRACE("recv failed: %d!\n",WSAGetLastError()); int recverror=0;
ret=send(sock,(char*)&recverror,4,0); closesocket(sock);
return 0;
}
客户端就是发了一个字符串然后等待接受。为什么我的closesocket(sock)好像没有关闭sock呢?WSAGetLastError()返回的错误是10038或者10054。我把linger设置成强制关闭也没有效果!请大家帮忙!

解决方案 »

  1.   

    10038 An operation was attempted on something that is not a socket. WSAENOTSOCK
    10054 An existing connection was forcibly closed by the remote host. WSAECONNRESET
      

  2.   

    在closesocket()前,先shutdown()试试!
      

  3.   

    连接建立好了,shutdown()也试了,没有用。客户端用的recv阻塞接受,出问题的时候就是阻塞在recv函数上。请问怎么样设置recv的超时时间?我想让它能够超时返回。
      

  4.   

    建议使用noblock socket使用select来进行i/o
      

  5.   

    请问有什么检测socke状态的的工具?我想看看closesocket是否发送FIN信号到客户端,还有客户端的FIN_ACK信号,以及什么close_wait状态
      

  6.   

    是不是什么netstat?netstat -a?