在C#中读取大量字节,引发异常?

在C#中读取大量字节,引发异常?,c#,sockets,client-server,C#,Sockets,Client Server,我有一个C#应用程序,它向服务器发送超过600000字节的数据。来自服务器的响应超过10000字节。我遇到的问题是,当我读取超过10k字节时,它会引发异常: System.Net.Sockets.SocketException:已创建现有连接 强制关闭位于的远程主机 System.Net.Socket.Socket.Receive(字节[]缓冲区,Int32偏移量,Int32 尺寸,SocketFlags(SocketFlags)位于 位于的System.Net.Sockets.Socket.R

我有一个C#应用程序,它向服务器发送超过600000字节的数据。来自服务器的响应超过10000字节。我遇到的问题是,当我读取超过10k字节时,它会引发异常:

System.Net.Sockets.SocketException:已创建现有连接 强制关闭位于的远程主机 System.Net.Socket.Socket.Receive(字节[]缓冲区,Int32偏移量,Int32 尺寸,SocketFlags(SocketFlags)位于 位于的System.Net.Sockets.Socket.Receive(字节[]缓冲区) SimpleTcpClient.Main(字符串[]args)

我的代码:

byte[] data = new byte[10000];
int receivedDataLength = server.Receive(data);
string Data = Encoding.ASCII.GetString(data, 0, receivedDataLength);

当您使用套接字时,您必须预料到套接字传输的字节数可能比您预期的要少。您必须循环.Receive方法以获取剩余字节

通过套接字发送字节时也是如此。您必须检查发送了多少字节,并循环发送,直到发送完所有字节

这种行为是由于网络层将消息拆分为多个数据包造成的。如果你的信息很短,那么你就不太可能遇到这种情况。但是你应该一直为它编码


随着每个缓冲区的字节数增加,您很可能会看到发送者的消息被吐入多个数据包。每个读取操作将收到一个数据包,它只是消息的一部分。但是小型缓冲区也可能被拆分。

查看异常消息,问题似乎可能在另一端。如果你不能在另一端修复它,也许你可以在将数据转换成字符串之前读取数据块并将其连接成一个数组。@Celada,在C#中为真,但在C中它们被定义为至少8位。存在一个字节为36位的体系结构!