Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务器未响应';Socket.BeginReceive';_C#_Sockets - Fatal编程技术网

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!"); }
}