如果服务端要主动向客户端发送数据,则必须要保留beginaccept所分配的socket引用。
关于短开连接,如果客户端是正常close的,那么客户端会发送通知给服务端,你的服务端程序则会受到onclose事件(好象是这个),但是如果客户端不是正常关闭,服务端则不会发现连接已关闭。此时向该socket进行write将会引起一个异常,定时向连接发送检测数据才能真正监测连接是否断开开。若要这样做,则必须保存所有的连接socket的引用

解决方案 »

  1.   


    HickMars(山鸡) :“则必须保存所有的连接socket的引用“什么意思
    在服务端,acceptCallback之后,就会有一个socket,进行beginsend和beginreceive,我在ReceiveCallback里只是
    Socket handler=(Socket)ar.AsyncState;
    int bytesSent=handler.EndSend(ar);
    然后就没管过handler,我是否要在接收完或发送完数据后需要对socket进行处理?怎样处理?
      

  2.   

    选1如果客户端需要关闭socket,是关闭后服务端自动检测到呢,还是客户端在关闭前先发送一条消息给服务端说要关闭了,在关掉自身的socket呢
    =============================================================================
    看你自己的要求了,如果只是客户端发给服务端信息,服务端给确认后没有其他的信息,你可以在客户端完成服务端确认信息的接收后断开socket连接,就是你上面的handler
    handler.Shutdown(SocketShutdown.Both)
    handler.Close()
    客户端连接断开,服务器端也断开,不需要户端在关闭前先发送一条消息给服务端说要关闭了
    比如
    [C#]
    public void readCallback(IAsyncResult ar) {
        StateObject state = (StateObject) ar.AsyncState;
        Socket handler = state.WorkSocket;    // Read data from the client socket.
        int read = handler.EndReceive(ar);    // Data was read from the client socket.
        if (read > 0) {
            state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
            handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,
                new AsyncCallback(readCallback), state);
        } else {
            if (state.sb.Length > 1) {
                // All the data has been read from the client;
                // display it on the console.
                string content = state.sb.ToString();
                Console.WriteLine("Read {0} bytes from socket.\n Data : {1}",
                   content.Length, content);
            }
            handler.Close();
        }
    }如果需要在以后服务器和客户端继续保持通信,可以保持这个handler
      

  3.   

    我在客户端传数据的时候,cpu都占到了90以上,屏幕的程序几乎都不动了,怎么回事,我的客户端编程就是常规的连接,传文件,接收结束符,关闭,没对线程做什么处理,怎么会这样,服务端也是,我设的listen(10),可有一个的时候服务端的cpu就90以上了
      

  4.   

    这个问题我知道,那时因为你操作的时候,没有把客户端socket关掉,因此,一个客户端连了多次,每次都不关掉,时间一长就这样了