调试自定义服务器套接字应用

时间:2018-04-13 03:09:32

标签: c# sockets

我一直在努力调试C#套接字应用程序的问题。该申请是我正在进行的大学任务的一部分。分配的范围是使用原始套接字构建Web服务器和游戏/应用程序服务器。就我而言,网络服务器提供静态文件,并充当游戏服务器的代理。服务文件似乎运行良好,但在将请求转发到游戏服务器时,存在数据传输问题。

完整source code is available on GitHub以供参考。但我认为有问题的区域在this area,它试图从响应网络服务器请求的游戏服务器读取响应的主体。以下是相关代码:

if (header.ContainsKey("content-length"))
{
    var bodyLength = Convert.ToInt32(header["content-length"]);

    Console.WriteLine($"Receiving body from game server.  Expecting {bodyLength} bytes");
    body = ReceiveBodyData(socket, bodyLength);
    Console.WriteLine($"Finished receiving body from game server.  Received {body.Length} bytes.");
}

执行此代码时,第一条消息将写入控制台,但第二条消息永远不会打印,因为方法ReceiveBodyData永远不会返回(最终会在无限循环中尝试读取正文数据)。 / p>

检查游戏服务器的输出,我看到连接从它结束时关闭,但我不确定是否会破坏收件人读取数据的能力。

任何人都可以协助调试此问题,小心地认识到这是我的分配,所以理想情况下请不要写大量的代码。

1 个答案:

答案 0 :(得分:0)

我想我已经找到了这个问题。我有committed changes修复了我的代码中的两个错误。

第一个错误

果然,ReceiveBodyData方法存在逻辑缺陷。方法如下:

protected byte[] ReceiveBodyData(Socket handler, int bodyLength)
{
    // we know how many bytes to expect, so we create an appropriate array and keep track 
    // of how many bytes we've received.
    var result = new byte[bodyLength];
    var totalBytesReceived = 0;

    while (true)
    {
        // The bug is in the line below
        var bytesCount = handler.Receive(result, totalBytesReceived, bodyLength - totalBytesReceived, SocketFlags.None);

        if (totalBytesReceived >= bodyLength)
        {
            return result;
        }
    }
}

我将读取的字节数分配给变量bytesCount,但我没有更新totalBytesReceived的值,所以我从未满足退出循环的条件。

第二个错误

我不太明白为什么会出现这个错误。有时,在建立有效连接并交换请求和响应后,将创建第二个连接。我的代码被卡住了,因为它正在侦听要传输的请求数据,但它永远不会,因为它似乎不是有效的连接。

我不知道浏览器是在尝试维持持久连接还是在这里发生了什么。如果没有要接收的数据,我现在返回null。侦听连接的代码,只是回到监听。