C# 没有TCPClient,如何通过套接字连接接收大数据流

C# 没有TCPClient,如何通过套接字连接接收大数据流,c#,sockets,C#,Sockets,我有一个问题,我想通过SocketConnection发送一个大字符串,但我无法立即接收字符串,因为网络限制为1500字节,因此如何在不使用TCPClient的情况下通过套接字接收所有字节,或者说这是不可能的 public string ReceiveString(Socket connection) { byte[] buffer = new byte[1048576]; int recBytes = connection.Receive(buf

我有一个问题,我想通过SocketConnection发送一个大字符串,但我无法立即接收字符串,因为网络限制为1500字节,因此如何在不使用TCPClient的情况下通过套接字接收所有字节,或者说这是不可能的

    public string ReceiveString(Socket connection)
    {
        byte[] buffer = new byte[1048576];
        int recBytes = connection.Receive(buffer);
        return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes);
    }
这就是我目前所拥有的


如果无法通过套接字将其获取,我是否可以将端点从套接字中取出以使用TCPClient作为“最后选项”?

TCP是一个字节流,它没有消息的概念。线路上各个数据包的大小是无关的,它只是网络硬件的一个实现细节。TCP保证发送的内容与接收的内容相同(但各个发送的大小与各个读取的大小之间不存在1对1的关系,就像UDP中那样)

该解决方案要求发送方以这样一种方式对字符串数据进行帧处理,即允许读取器知道何时停止读取。要么:

  • 在发送字符串数据之前发送字符串长度。然后读取器可以先读取长度,然后读取指定数量的以下字节

  • a。使用无法显示在字符串本身中的唯一分隔符终止字符串。然后,读取器可以继续读取,直到遇到分隔符为止

    b。分隔符可以是连接的闭包。读卡器可以一直读取,直到检测到断开连接


  • 您需要使用哪种解决方案取决于您正在实施的特定协议#1最适合于二进制协议,并允许高效的内存管理,而#2更适合于基于文本的协议,或最终长度事先未知的流式协议。有时,当#1和#2a不可能时,协议必须求助于#2b(HTTP和FTP都会利用它作为时间)。你必须亲自实现将数据拆分为数据包并接收(连接)它们。你不能。TCP将每条消息分成约1500字节的数据报。当您应该使用异步方法时,您使用的是synchronous Receive()方法。您需要向发送函数添加一个终止字符,以便接收函数可以继续读取1500个数据报,直到找到结束字符。TCP是否有某种结束序列?我是说,我听说了\0?@Silent3241不,它没有。TCP根本没有消息的概念。TCP之上的高级应用程序定义的协议实现消息帧。@jdweng切换到异步读取不会解决问题。同步阅读可以很好地工作。解决方案是框定字符串,以便读者知道何时停止阅读。1)在发送字符串之前发送字符串长度,或2)使用字符串中无法出现的唯一分隔符终止字符串。或切换到TCP上构建的更高级别协议,该协议为您实现消息传递/帧。@Damien_不相信者您可能认为更多的是预制库而不是协议。如果你只是设计/采用一个消息传递协议,你仍然需要实现发送和读取消息帧的代码。也就是说,一个建立在TCP之上的协议,它已经有了消息传递的概念。@Damien_是一个不相信它的人,它并没有真正改变我说的话。如果您手动实现HTTP(或其他),您必须自己编写消息逻辑(HTTP实际上利用了我在回答中提到的所有三种框架方案),除非您使用一个预制作的库来处理消息细节。好吧,我认为这只是一个措辞问题。我的意思是“切换到更高级别的协议,并使用该协议的预先实现”。