我一直在努力调试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>
检查游戏服务器的输出,我看到连接从它结束时关闭,但我不确定是否会破坏收件人读取数据的能力。
任何人都可以协助调试此问题,小心地认识到这是我的分配,所以理想情况下请不要写大量的代码。
答案 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
。侦听连接的代码,只是回到监听。