C# 服务器未响应';Socket.BeginReceive';
我的问题:当客户端试图通过C# 服务器未响应';Socket.BeginReceive';,c#,sockets,C#,Sockets,我的问题:当客户端试图通过Socket.BeginReceive连接到服务器时,服务器没有响应。我曾尝试合并一个try/catch块,但结果证明没有用。即使在VS调试器中,它也不会给我一个错误日志,而是进入Windows7的“程序没有响应”屏幕 这种情况并非总是发生……只有在大约5或6次成功连接和断开后才会发生 以下是相关代码(服务器端,因为崩溃发生在服务器端): 接收方法: static void Receive(IAsyncResult result) { Remote r = (R
Socket.BeginReceive
连接到服务器时,服务器没有响应。我曾尝试合并一个try/catch
块,但结果证明没有用。即使在VS调试器中,它也不会给我一个错误日志,而是进入Windows7的“程序没有响应”屏幕
这种情况并非总是发生……只有在大约5或6次成功连接和断开后才会发生
以下是相关代码(服务器端,因为崩溃发生在服务器端):
接收方法:
static void Receive(IAsyncResult result)
{
Remote r = (Remote)result.AsyncState;
if (r.disconnected) return;
try
{
int length = r.connectionSocket.EndReceive(result);
if (length == 0) { r.Disconnect(); return; }
byte[] b = new byte[r.buffer.Length + length];
Buffer.BlockCopy(r.buffer, 0, b, 0, r.buffer.Length);
Buffer.BlockCopy(r.tempbuffer, 0, b, r.buffer.Length, length);
r.buffer = r.HandleMessage(b);
r.connectionSocket.BeginReceive(
r.tempbuffer, 0, r.tempbuffer.Length, SocketFlags.None,
new AsyncCallback(Receive), r);
}
catch (SocketException) { r.Disconnect("Error!"); }
catch (Exception e) { ErrorLog(e); r.Disconnect("Error!"); }
}
我看到ip连接
消息,但之后它没有响应。执行此操作时,Receive
方法永远不会被调用
有人知道为什么会发生这种情况吗?或者您给它提供了一个无效的IP和端口来连接,或者异步接收的实现只是在永远重复一些事情。代码太少,无法找出可能的错误。另外,如果在
Receive
中设置断点,是否会调用它?是否调用相应的EndReceive
?我想知道您是否打开了太多连接(而没有关闭它们),以致服务器停止响应新请求……当程序挂起时,请中断调试器并查看Threads
视图。您总是应该调用EndReceive
;您不应该费心检查r.disconnected
。与其自己尝试使用字节缓冲区,不如使用MemoryStream
。这是一个没有证据的明目张胆的猜测。回答不好。
static void Receive(IAsyncResult result)
{
Remote r = (Remote)result.AsyncState;
if (r.disconnected) return;
try
{
int length = r.connectionSocket.EndReceive(result);
if (length == 0) { r.Disconnect(); return; }
byte[] b = new byte[r.buffer.Length + length];
Buffer.BlockCopy(r.buffer, 0, b, 0, r.buffer.Length);
Buffer.BlockCopy(r.tempbuffer, 0, b, r.buffer.Length, length);
r.buffer = r.HandleMessage(b);
r.connectionSocket.BeginReceive(
r.tempbuffer, 0, r.tempbuffer.Length, SocketFlags.None,
new AsyncCallback(Receive), r);
}
catch (SocketException) { r.Disconnect("Error!"); }
catch (Exception e) { ErrorLog(e); r.Disconnect("Error!"); }
}