【发布时间】:2016-08-25 14:40:03
【问题描述】:
我有一个问题,我想通过 SocketConnection 发送一个大字符串,但由于网络限制为 1500 个字节,我无法立即接收该字符串,所以我如何才能通过 Socket 接收所有字节而不使用 TCPClient,或者那是不可能的。
public string ReceiveString(Socket connection)
{
byte[] buffer = new byte[1048576];
int recBytes = connection.Receive(buffer);
return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes);
}
这就是我目前所拥有的。
如果不可能,要通过 Socket 获取它,我可以从 Socket 中获取 EndPoint 以使用 TCPClient 作为“最后一个选项”吗?
【问题讨论】:
-
您必须自己实现protocol level 才能将数据拆分为数据包并接收(连接)它们。
-
你不能。 TCP 将每条消息分解为大约 1500 字节的数据报。当您应该使用异步方法时,您正在使用同步 Receive() 方法。您需要在发送函数中添加一个终止字符,以便接收函数可以继续读取 1500 个数据报,直到找到结束字符。
-
我的意思是,TCP 不是有某种结束序列吗,我听说了一些关于 \0 的事情?
-
@Silent3241 不,它没有。 TCP 根本没有消息的概念。 TCP 之上的更高级别的应用程序定义协议实现消息帧。
-
@jdweng 切换到异步读取并不能解决问题。同步阅读就可以了。解决方案是将字符串框起来,以便读者知道何时停止阅读。要么 1) 在发送字符串之前发送字符串长度,要么 2) 使用不能出现在字符串中的唯一分隔符终止字符串。