服务器只连一个客户端,没问题。
连接两个后,过一会就有一个客户端程序死了,不响应用户操作。
关闭死的程序后,重新开一个客户端,就好了。
但过一会有死了。
是不是服务器客户端socket没有响应,所以客户端的send无法返回,才死的?
如何解决?

解决方案 »

  1.   

    所以客户端的send无法返回,才死的.-->不可能。
    死了只是没有相应而已,多半是出于阻塞状态。检查一下client端有没有recv()一类的阻塞函数。
      

  2.   

    服务器端用的是OnReceive()
    死了就是指不再没有响应用户操作啊
      

  3.   

    I think maybe you did not release the resource after finish using it,maybe your resource is not enough
      

  4.   

    send只负责发到网络上去,不管对方是否收到,如果在send上阻塞,跟服务器端无关,只与本地发送失败有关(也可能是本地缓充区用光)。但你说有一个客户端死掉,就是说有一个没有死,所以应该不是它阻塞了。
    而且MFC的send是一个非阻塞函数。
    你可以观察一下使用两个客户端时死的情况,死掉一个后,关掉开一个新的,是否两个客户端都会死,还是先开的不会死。
      

  5.   

    fd_set chkSockSet ;
    struct timeval delayTime ;
    FD_ZERO(&chkSockSet) ; //清空
    FD_SET(hCleintSock,&chkSockSet) ; //插入代检测的Socket
    delayTime.sec = 0 ;   //设定检测超时
    delayTime.usec = 10 ; 
    select(0,&chkSockSet,NULL,NULL,&delayTime) ; //检查可读取端口if(FD_ISSET(hClientSock,&chkSockSet)) { //非零代表端口有数据,可读!
       nRetVal = recv(hClientSock,buffer,MAX_BUF_LEN,0) ;
       if(nRetVal == 0 || nRetVal == SOCKET_ERROR) {
          //错误处理!
       }
    }
    这些应该可以了。
      

  6.   

    用一个定时器,定时(如10毫秒)调用OnReceive()函数
      

  7.   

    1 Tcp? Udp?2 socket通讯是端对端的。3 服务器是多线程吗?使用的是什么模型?
      

  8.   

    如果是单线程的,就一定要用非阻塞socket.
    如果是多线程的,而且用了阻塞socket,
    切忌不要在同一个线程里对两个连接进行读写,
    否则一个连接有问题就会影响到其他连接。你的问题好像是第二种情况。
      

  9.   

    用的TCP
    单线程的
    客户端用的send,服务器端用的OnReceive,应该是非阻塞的吧?
      

  10.   

    不知道你是用阻塞还是非阻塞?如果用阻塞完全可能发生你所说的情况,所以用阻塞你应该设置发送超时,然后用WSAGetLaseError看返回值。这样用send发送就不会因各种原因而阻塞线程。用非阻塞就不会出现这种情况。
      

  11.   

    OnReceive是回调函数,应该不阻塞吧?
    Send好像也不会阻塞吧?
      

  12.   

    OnReceive是回调函数,应该不阻塞吧?
    Send好像也不会阻塞吧?
      

  13.   

    OnReceive是回调函数,应该不阻塞吧?
    Send好像也不会阻塞吧?