【发布时间】:2017-10-17 16:17:11
【问题描述】:
我正在为通过 GPRS 连接的生物识别指纹设备编写服务器。服务器从设备接收 GET 和 POST 请求,然后执行所需的操作。
对于 POST 请求,设备应在请求中附加一些附加数据。
问题是,当我通过 LAN 将设备连接到服务器时,所有数据都可以正常通过。当我通过 GPRS 连接时,我的服务器没有接收到请求正文。
左边是我通过 LAN 连接时...附上邮件正文。右边,是通过GPRS,一切照旧,但是,没有body。
我通过 LAN 和 GPRS 连接运行 Wireshark。当我向下钻取时,这些数据包都附有正文,但在 Wireshark 上,通过 GPRS,我收到类似上面的消息 - 出现故障和 RST、ACK 以及有时是 PSH、ACK。
与 LAN 数据包相比,没有这些问题。
这是我用来从 TCPListener 读取的代码
try
{
if (tcp == null)
{
this.tcp = new TcpListener(IPAddress.Parse(serverIP), port);
}
this.tcp.Start();
listening = true;
while (listening)
{
Socket mySocket = null;
// Blocks until a client has connected to the server
try
{
mySocket = this.tcp.AcceptSocket();
Thread.Sleep(500);
byte[] bReceive = new byte[1024 * 1024 * 2];
mySocket.Receive(bReceive);
Analysis(bReceive, mySocket);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
this.tcp.Stop();
这是我从他们的开发者那里得到的原始代码。我尝试了异步、TcpClient 和不同套接字选项(例如 KeepAlive 和 DontLinger)的各种组合,但似乎没有一个能解决这个问题。
除了在 C# 中手动捕获数据包以获取正文之外,是否有任何 C# 类可以用来读取整个请求?
【问题讨论】:
-
您在两次捕获中都获得了 200 OK,这意味着 HTTP 层工作正常。在第二个你有 [FIN, ACK] 这是连接关闭的 ACK。所以 172.31.168.217 是发送关闭确认。看起来 FIN(完成)继续发生。我会找出 FIN 发生的原因。
-
我会摆脱睡眠并使用来自 msdn 的代码:msdn.microsoft.com/en-us/library/fx6588te(v=vs.100).aspx
-
@jdweng 您是否认为乱序消息与此有关?谢谢你的链接,我试试看。
-
可能的。乱序本身不会引起问题。它可能表示由于硬件故障而丢弃了数据包,但 PC 中的驱动程序会重新排序数据包。我认为该软件在不应该关闭连接时关闭了连接。同样,这可能是硬件问题,但不是决定性的。我认为正确的做法是找出第一个 FIN 发生在哪里。我还想看看是否有任何 SEQ 由于退休而重复。我不知道您对 TCP 规范和 c# 代码的理解程度如何。我是个专家。从事 TCP 测试 5 年。
-
@jdweng 我不明白的是,即使数据包被丢弃并且软件可能正在关闭连接,WireShark 仍然可以重组数据包并获取我正在寻找的数据,但在 C# 中我不能。
标签: c# rest sockets networking tcp