服务端开启一个线程,专门accept,如果有新的连接则创建新线程,在这新线程中也是一个while循环反复读取数据。除非读取出错。
在一个客户端的时候没有问题,但如果有两个客户端,第二个连接成功后过一下前一个负责读取客户端数据的线程就会退出,查看错误是10054“An existing connection was forcibly closed by the remote host. ”。不是listen问题,我设的最大连接数目是客户端数目的两倍。在想会不会和客户端的连接方法有关,或者和服务端绑定时的设置有关?

解决方案 »

  1.   

    那应该还是你的服务器端代码有问题,把accept之后创建的新线程的代码贴一下看看?
      

  2.   

    跟listen数无关.
    应该是你处理client thread时,有公共变量的访问.调试下.
      

  3.   

    没有什么特别的代码,这是设置心跳机制DWORD dwError = 0L ,dwBytes=0; 
    tcp_keepalive sKA_Settings = {0}, sReturned = {0} ; 
    sKA_Settings.onoff = 1 ; 
    sKA_Settings.keepalivetime = 5500 ; // Keep Alive in 5.5 sec. 
    sKA_Settings.keepaliveinterval = 3000 ; // Resend if No-Reply 
    if (WSAIoctl(tcpClientSock, SIO_KEEPALIVE_VALS, &sKA_Settings, 
    sizeof(sKA_Settings), &sReturned, sizeof(sReturned), &dwBytes, 
    NULL, NULL) != 0) 

    dwError = WSAGetLastError() ; 
    }之后是确定这是第几个连接,保存socket到全局数组里,然后就开启线程CWinThread* pThread=AfxBeginThread(RecvThread,(LPVOID)emptyIndex);RecvThread中也没什么特别的,就是while循环反复读取 while(1){
    memset(&msg,0,sizeof(MSG_RECEIVE));

    int count=recv(glClientInfoList[index].sock,(char*)&msg,sizeof(MSG_RECEIVE),0);

    if(count>0){
    ProcessMessage(glClientInfoList[index].module,msg,index);

    }else
    break;
    }
            LogDll("WSAGetLastError()",WSAGetLastError());但在新的客户端连接时,就会退出循环,打印出LastError是10054
      

  4.   

    你的
    memset(&msg,0,sizeof(MSG_RECEIVE));
    int count=recv(glClientInfoList[index].sock,(char*)&msg,sizeof(MSG_RECEIVE),0);
    msg是什么?
    是结构体的话,直接就是:
    memset(msg,0,sizeof(MSG_RECEIVE));
    int count=recv(glClientInfoList[index].sock,(char*)msg,sizeof(MSG_RECEIVE),0);
      

  5.   

    这个帖子和我的做法现象一模一样
    http://topic.csdn.net/u/20080102/17/6a0edae5-f506-44e0-aa30-f54bf11a1e70.html