我正在使用 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);
}
}