1

我正在使用 C# winsock 类编写客户端/服务器程序。多线程服务器(每个客户端连接 1 个线程)向客户端发送小块数据。出于性能原因,我尝试使用 BeginSend 而不是 Send。它似乎工作正常。我遇到的唯一问题是 BeginSend 每隔几个小时就会停止发送数据,客户端必须重新连接才能接收更多数据。所以我尝试在服务器上添加 EndSend 回调,问题仍然存在。在客户端,我只使用 Receive 而不是 BeginReceive,并且我没有在服务器代码中使用信号量。代码非常简单。我确实注意到的一件事是服务器上似乎有空闲的客户端连接,我想知道它是否是由死锁引起的。有谁知道为什么会这样?非常感谢!

这是实际发送的代码:

    protected virtual void SendMessage(Socket socket, byte[] message)
    {
        try 
        {
            if (socket.Connected)
            {
                _StateObject state = new _StateObject();

                state.socket = socket;
                state.nBytes = message.Length;

                socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallback), state);
            }
        }
        catch (Exception ex)
        {
            SocketErrorEventArgs e = new SocketErrorEventArgs();
            e.ex = ex;
            if (SocketBeginSendError != null) SocketBeginSendError(null, e);
        }
    }

    protected virtual void SendCallback(IAsyncResult ar)
    {
        try
        {
            _StateObject state = (_StateObject)ar.AsyncState;
            Socket s = state.socket;

            int nBytesActuallySent = s.EndSend(ar);

            if (nBytesActuallySent != state.nBytes)
            {
                SocketErrorEventArgs e = new SocketErrorEventArgs();
                e.nBytes1 = state.nBytes;
                e.nBytes2 = nBytesActuallySent;
                if (SocketIncompleteSendError != null) SocketIncompleteSendError(null, e);
            }

        }
        catch (Exception ex)
        {
            SocketErrorEventArgs e = new SocketErrorEventArgs();
            e.ex = ex;
            if (SocketEndSendError != null) SocketEndSendError(null, e);
        }
    }
4

0 回答 0