概括:
我猜测这里的问题与 Windows 和 Linux 如何处理 TCP 连接或套接字有关,但我不知道它是什么。我正在启动与其他人开发的定制硬件的 TCP 连接,并且我正在尝试了解其行为。为此,我创建了一个 .Net core 2.2 应用程序;在Windows系统上运行,我可以成功启动连接,但在Linux(最新的Raspbian)上,我不能。
看来这可能是因为 Linux 系统不会在 RST 之后尝试重试/重新传输 SYN,而 Windows 系统会这样做 - 而且这种行为似乎是这个特殊硬件工作原理的关键。
背景:
我们有一个黑匣子硬件,可以使用制造商提供的 Windows 应用程序通过网络进行控制和查询。数据未加密,无需身份验证即可连接,并且应用程序还存在一些其他问题。最终,我们希望能够将数据从它中继到另一个系统,因此我们决定制作自己的应用程序。
我花了相当长的时间试图理解数据包格式,并创建了一个针对 .net core 2.2 的库,可用于与该套件成功通信。在这样做时,我发现该设备似乎需要通过 UDP 发送一种“请求连接”命令。之后,我就能够在端口 16000 上启动 TCP 连接,尽管第一次 TCP 尝试总是会返回 RST、ACK - 因此需要进行第二次尝试。
我开发的东西在 Windows (x86) 和 Linux (Raspberry Pi/ARM) 系统上都运行得非常好,并且我可以发送和接收数据。但是,在Raspbian系统上运行时,发起TCP连接时似乎出现问题。我可以发誓,我们让它在以前的版本中工作得绝对正常,但以前的提交似乎都不起作用 - 所以它很可能是系统/内核更新改变了一些东西。
问题:
当启动与该设备的 TCP 连接时,它将立即重置连接。即使使用制造商提供的软件,它也会立即重新尝试连接并成功;因此,这种重置一次然后第二次起作用的行为本身并不是我可以控制的“问题”。
我想要理解的是为什么 Windows 系统会立即通过重传重新尝试连接......

..但是Linux系统在一次尝试后就放弃了(这是数据包捕获的结束..)

为了证明这不是特定于应用程序的问题,我尝试在 Windows 系统和 Raspbian 系统上使用 ncat/netcat,以及在单独的笔记本电脑上使用 Kali 系统来证明这不是 ARM/Raspberry 问题。由于 UDP“请求”尚未发送,因此连接永远不会成功,但这只是说明了操作系统之间的不同行为。
Linux 版本看起来与上面几乎相同,它们发送一个被重置的数据包 - 而 Windows …
我是.Net开发的新手,所以我认为我将从.Net Core课程开始。到目前为止,一切都很好; 我正在尝试创建一个API,该API需要在JSON对象中存在特定键。如果至少有一个键丢失,我希望它是无效的。
[HttpPost("new")]
public IActionResult CreateGPSPoint([FromBody] ModelExample dataObject)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,即使我省略了我发送的JSON有效负载中的某些或全部键,IsValid也会返回true。经过检查,那些缺失的键在后续模型的属性上设置为0;这就是我的模型的样子。
public class ModelExample
{
[Required(AllowEmptyStrings = false)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public float Height{ get; set; }
[Required(AllowEmptyStrings = false)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public decimal Width{ get; set; }
[Required(AllowEmptyStrings = false)]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public int Depth{ get; set; }
//Populated by the entity later, but feel free to critique nevertheless
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于这种问题在这里其他地方已经提出过几次,因此我尝试了Required(AllowEmptyStrings = false)和DisplayFormat(ConvertEmptyStringToNull …