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