用CAsyncSocket类派生出三个类,用于服务器端程序。一个类(TcpListen)用于监听TCP连接,一个类(TcpProcess)用于TCP数据处理,一个类(UdpProcess)用于UDP数据处理。
    由于客户端比较多,而且UDP数据传输量大,如果只建立一个udp socket对象的话,客户端同时往一个端口发数据,会影响整体性能,因此为每个客户端建立了一个UdpProcess类对象。
    具体工作流程是:当有客户端通过TCP发起connect连接的时候,就为该客户创建一个TcpProcess对象用于接收和发送一些命令,同时也为该客户端创建一个UdpProcess的对象来进行UDP数据收发,其中TcpProcess对象和UdpProcess对象是相关联的,有一个TcpProcess对象存在,就有一个UdpProcess对象存在,当客户端关闭TCP连接的时候,就销毁相关联的TcpProcess对象和UdpProcess对象。
    目前,TCP数据处理部分经过测试,已经基本没有什么问题了,本来以为UDP会简单一些,可是发现了一些奇怪的问题,UDP是无连接的,我告诉每个客户端对象,服务器端的IP和UDP接收端口(对每个客户端端口都不一样),同时也知道对方的IP和端口,应该就能对该客户端进行数据收发。我用本机测试的时候,启动服务端程序,UdpProcess对象绑定了10000端口,udp调试工具作为客户端,不断向10000端口发数据,同时开通了20000端口收数据(这个20000端口是我给客户端指定的,其实UDP不存在服务端和客户端区别,这里服务端专指我的程序,客户端就相当于第三方调试工具吧)。如果同时开启20000发,10000收两个udpsocket就没有问题,如果把10000收的那个udp连接关闭的话,就会在UdpProcess类成员函数的RecvFrom中收到10054的错误代码,而且每发一次,就弹出一次错误。按道理来说,UDP是无连接的,不关心收发结果,但是怎么会收到错误信息?
     不知道我描述清楚没有,请各路高手指点迷津。

解决方案 »

  1.   

     当然了,对方已经关闭连接,你再发送,当然会出错。你说UPDP不会返回错误信息不对,请看msdn上的说明。CAsyncSocket::SendTo
    int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 );int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 );Return ValueIf no error occurs, SendTo returns the total number of characters sent. (Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function: 
    错误代码10054就是说远程主机强迫关闭了一个现有的连接。
      

  2.   

    10054: An existing connection was forcibly closed by the remote host. 
      

  3.   

    guoxuqu说的很在理,只是我的错误在ReceFrom的时候弹出。不知道是不是CAsyncSocket类的特性。
    我测试的时候,只是弹出错误,程序照样运行,那是不是不管它就行了,会不会留下什么隐患?或者有什么办法来避免这种错误?