C#如何获取socket包中数据的实际大小

How to get the actual size of data in socket packet c#

我正在使用 TCP 套接字在 C# 中构建一个端口转发。它不必担心正在使用的应用程序协议。

但是,根据应用协议,数据包大小可能会影响协议...例如,当使用 FTP 进行身份验证时,尾随字节 (00) 可能会导致在发送 USER 和 PASSWORD 时出错港口前进。所以...我决定通过删除最后一个 00 序列来删除尾随字节...

但是,ssh 协议开始变得混乱...通过删除尾随字节,我最终得到格式错误的数据包...

我认为的解决方案是在数据第一次到达端口转发时获取数据的实际大小,然后将数据包的确切大小转发到端点。

我的问题是当数据到达套接字时如何获取数据的实际大小,例如:当我使用 socket.Receive 获取发送到端口转发工具的字节时(通过一个简单的 ssh blabla@ someIP),我怎么知道实际数据的最后一个字节是什么?最后一个数据包的字节数总是少于实际缓冲区大小,但我不知道如何将额外分配 space 与 00 形式的实际数据区分开来。

OBS:我正在使用 Socket class 和接收、发送功能。

忘记零;您无法通过查找零来了解有关数据的任何信息 - 事实上,垃圾可能不会 零(缓冲区回收等)。接收数据时,你必须查看来自Receive的return值,它告诉你读取了多少数据.发送数据时:你的工作是告诉它缓冲区中有多少实际上是数据——你可以为此使用缓冲区Socket.Send 的重载采用 byte[] buffer, int offset, int size - 或者其他采用 ArraySegment<byte> 片段的重载(对于不连续的缓冲区)。