gpt4 book ai didi

c# - Tcp/Ip C# 错误请求/丢失数据包

转载 作者:可可西里 更新时间:2023-11-01 02:50:20 26 4
gpt4 key购买 nike

我目前正在使用一种测量设备,它内置了一个嵌入式 Linux 网络服务器,可以用所谓的 CGI 进行控制。 - 局域网接口(interface)。如果要更改设备的设置,必须首先发送一个 TCP/IP 登录数据包,然后发送一个键码来控制指定功能或接收数据。

通过使用 TCP/IP 数据包工具,例如 Paket Sender ,一切正常。从 192.168.0.2(PC) 到 192.168.0.1(Device) 端口 80 的登录数据包,带有 ASCII 文本(这些是标准密码和登录名,所以我不会模糊处理):

GET /cgi-bin/login.cgi?username=long&password=nga HTTP/1.0 \n \n

从设备成功接收和确认,如 wireshark 协议(protocol)所示: Wireshark Screenshot

但与 Standard C# TCP/IP Client 相同的请求由 Microsoft 提供,返回 Bad Request 错误消息。有些 C# 不会像“数据包发送者”那样发送 [FIN,ACK] 数据包。微软修改后的代码如下:

// Data buffer for incoming data.  
byte[] bytes = new byte[1024];

// Connect to a remote device.
try
{
// Establish the remote endpoint for the socket.
// This example uses port 11000 on the local computer.
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 80);

// Create a TCP/IP socket.
Socket sender = new Socket(IPAddress.Parse("192.168.0.1").AddressFamily,
SocketType.Stream, ProtocolType.Tcp);

// Connect the socket to the remote endpoint. Catch any errors.
try
{
sender.Connect(remoteEP);

Console.WriteLine("Socket connected to {0}",
sender.RemoteEndPoint.ToString());

// Encode the data string into a byte array.
byte[] msg = Encoding.ASCII.GetBytes("GET /cgi-bin/login.cgi?username=long&password=nga HTTP/1.0 \n \n");

// Send the data through the socket.
int bytesSent = sender.Send(msg);

// Receive the response from the remote device.
int bytesRec = sender.Receive(bytes);
Console.WriteLine("Echoed test = {0}",
Encoding.ASCII.GetString(bytes, 0, bytesRec));

// Release the socket.
sender.Shutdown(SocketShutdown.Both);
sender.Close();

}
catch (ArgumentNullException ane)
{
Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
}
catch (SocketException se)
{
Console.WriteLine("SocketException : {0}", se.ToString());
}
catch (Exception e)
{
Console.WriteLine("Unexpected exception : {0}", e.ToString());
}

}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

此代码段的输出:

Socket connected to 192.168.0.1:80
Echoed test = HTTP/1.0 408 Request Timeout
Content-type: text/html
Date: Mon, 26 Mar 2018 16:41:34 GMT
Connection: close

<HTML><HEAD><TITLE>408 Request Timeout</TITLE></HEAD>
<BODY><H1>408 Request Timeout</H1>
No request appeared within 60 seconds
</BODY></HTML>

Wireshark Screenshot本次通信。

嗯,我不知道,为什么 C# 不发送 [FIN,ACK] 消息。也许有人有过同样的经历?或者对此有一个简单的解释?也许我在 TCP/IP 套接字中遗漏了一个选项?如果有帮助,我还可以提供 Wireshark 协议(protocol)文件。

最佳答案

我猜服务器要求发送方在发送响应之前发送 FIN/ACK,是吗? FIN 意味着关闭该(定向)流,因此如果问题确实是缺少 FIN,我猜测您在这里需要的是发送请求但是< em>在 监听响应之前,添加:

sender.Shutdown(SocketShutdown.Send);

哪个应该 FIN 出站连接。

但是,另请参阅 Dirk 对该问题的评论;可能只是因为您没有正确形成完整的请求,而 FIN 当前使其间接工作

请注意,您可能想要设置 sender.NoDelay = true;,尽管这应该是无关的。

关于c# - Tcp/Ip C# 错误请求/丢失数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49487706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com