C#中的客户端套接字
Posted
技术标签:
【中文标题】C#中的客户端套接字【英文标题】:Client Socket in C# 【发布时间】:2021-11-14 05:42:50 【问题描述】:我无法从套接字获取数据。这是客户端(下图),其中“_sender”是套接字。我想要的是有一个与从服务器接收到的字节大小相同的缓冲区(我不知道先验)。所以我要做的是通过“可用”语句检查套接字(“_sender”)准备从服务器接收多少字节。 你觉得这个推理对吗?
byte[] bufferRec = new byte[0];
int bytesAvailable = 0;
int offset = 0;
System.Console.WriteLine(_sender.Available);
while (_sender.Available != 0)
bytesAvailable = _sender.Available;
Array.Resize(ref bufferRec, bufferRec.Length + bytesAvailable);
int read = _sender.Receive(bufferRec, offset, bytesAvailable, SocketFlags.None);
offset += read;
【问题讨论】:
您的实际问题是什么? 如果这是一个 TCP 套接字,那么你需要在它上面使用一些协议,因此你必须事先知道你需要读取多少字节,然后读取直到你读取了那么多字节。例如,您可以在“消息”前面加上其长度(以字节为单位),并使用前 2 或 4 个字节发送该长度。然后接收者首先准确地读取 2(4) 个字节,现在它知道消息的长度并且它读取了那么多。 【参考方案1】:套接字是一个连续的字节流。仅当另一端停止发送时,流才会停止。
将流想象成磁盘上的二进制文件,您需要了解该二进制文件是如何“成帧”的,您需要知道位和字节在哪里开始和停止。
例如,
Byte[0..3] = MessageID
Byte[4..5] = MessageSize in Bytes
Byte[6..6+MessageSize] = Payload
现在您将读取字节 0-5,然后提取有效负载,获取消息大小并从流中读取有效负载。然后你会重复那个。
当然,您还需要错误处理,如果流在提取有效负载之前结束会发生什么,如果服务器离线,可能会发生这种情况。这类似于磁盘上的文件被损坏和简短。
【讨论】:
以上是关于C#中的客户端套接字的主要内容,如果未能解决你的问题,请参考以下文章