【问题标题】:How to get the actual size of data in socket packet c#如何获取套接字数据包中数据的实际大小c#
【发布时间】:2020-10-08 10:01:18
【问题描述】:

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

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

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

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

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

OBS:我正在使用 Socket 类和接收、发送函数。

【问题讨论】:

    标签: c# sockets tcp portforwarding


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多