服务器未响应'Socket.BeginReceive'

问题描述:

我的问题:当客户端尝试通过Socket.BeginReceive连接到服务器时,服务器无响应。我试过整合一个try/catch区块,但这被证明是无用的。甚至在VS调试器中,不是给我一个错误日志,它只是进入Windows 7“程序无响应”屏幕。服务器未响应'Socket.BeginReceive'

它不会一直发生......只有在大约5或6次成功连接和断开连接之后。

下面是相关代码(服务器端,因为崩溃发生服务器端):

public Remote(Socket s) 
{ 
    tempbuffer = new byte[300]; 
    buffer = new byte[0]; 
    connectionSocket = s; 
    ip = connectionSocket.RemoteEndPoint.ToString().Split(':')[0]; 
    Log(ip + " connecting..."); 

    connectionSocket.BeginReceive(
     tempbuffer, 0, tempbuffer.Length, SocketFlags.None, 
      new AsyncCallback(Receive), this); 
} 

Receive方法:

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 connecting消息,但随后后,它是反应迟钝。当它这样做时,Receive方法从不会被调用。

有谁知道为什么会发生这种情况?

+0

它太少的代码来找出可能是错误的。另外,如果你在'Receive'中设置了一个断点,它会被调用吗? – 2012-08-10 06:09:07

+0

你在调用相应的'EndReceive'吗?我想知道如果你打开这么多的连接(而不是关闭它们),服务器会停止响应新的请求... – 2012-08-10 10:25:10

+0

当程序挂起时,打开调试器并查看'Threads'视图。 你总是*应该调用'EndReceive';你不应该麻烦检查'r.disconnected'。你可以使用'MemoryStream'来代替尝试自己使用字节缓冲区。 – EricLaw 2015-03-20 18:00:49

要么你给它一个无效的IP和端口连接或异步接收的实现只是永远重复的事情。

+0

对不起,忘记提及崩溃是服务器端;编辑到后大声笑... – Jonny 2012-08-10 00:41:39

+0

这是一个公然的猜测基于没有证据。回答不好。 – 2012-08-10 10:25:35