Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得套接字数据包c中数据的实际大小#_C#_Sockets_Tcp_Portforwarding - Fatal编程技术网

C# 如何获得套接字数据包c中数据的实际大小#

C# 如何获得套接字数据包c中数据的实际大小#,c#,sockets,tcp,portforwarding,C#,Sockets,Tcp,Portforwarding,我正在使用TCP套接字在C#中构建一个端口转发。它不必担心正在使用的应用程序协议 然而,根据应用协议,数据包大小可能会影响协议。。。例如,使用FTP进行身份验证时,通过端口转发发送用户和密码时,尾随字节(00)可能会导致错误。所以我决定通过删除00的最后一个序列来删除尾随字节 但是,ssh协议开始变得混乱。。。通过删除尾随字节,我最终得到格式错误的数据包 我认为解决方案是在数据第一次到达转发端口时获得数据的实际大小,然后将数据包的确切大小转发到端点 我的问题是,当数据到达套接字时,如何获取数据的

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

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

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

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

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


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

忘记零;您无法通过查找零来判断数据的任何内容,事实上,垃圾可能不是零(缓冲区回收等)。接收数据时,您必须查看
Receive
中的返回值,它告诉您读取了多少数据。发送数据时:告诉它缓冲区中有多少实际上是数据是您的工作——您可以使用缓冲区段来实现这一点;套接字存在重载。
发送
占用
字节[]缓冲区、int偏移量、int大小
-或占用
数组分段
片段(用于不连续缓冲区)的其他重载。

忘记零;您无法通过查找零来判断数据的任何内容,事实上,垃圾可能不是零(缓冲区回收等)。接收数据时,您必须查看
Receive
中的返回值,它告诉您读取了多少数据。发送数据时:告诉它缓冲区中有多少实际上是数据是您的工作——您可以使用缓冲区段来实现这一点;Socket.Send的
重载使用
字节[]缓冲区、int偏移量、int大小
-或其他重载使用
数组分段
片段(用于不连续的缓冲区)