C# 通过Tcp客户端读取大数据包

C# 通过Tcp客户端读取大数据包,c#,tcp,C#,Tcp,使用TCP客户端时,NetworkStream.read方法通常不会返回完全填满的缓冲区。如何使其阻止进一步执行,直到写入整个数组 byte[] datagramByteForm = new byte[dgramSizeInt]; int j = dataIOStream.Read(datagramByteForm, 0, datagramByteForm.Length);//read the actual datagram if (j != datagramByteForm.Length) {

使用
TCP
客户端时,
NetworkStream.read
方法通常不会返回完全填满的缓冲区。如何使其阻止进一步执行,直到写入整个数组

byte[] datagramByteForm = new byte[dgramSizeInt];
int j = dataIOStream.Read(datagramByteForm, 0, datagramByteForm.Length);//read the actual datagram
if (j != datagramByteForm.Length)
{
    throw new Exception("Connection j value: " + j + " expected amount: " + datagramByteForm.Length);
}

实际上非常简单,您只需要在stream.read函数中使用提供的参数。 以下是一个示例(未经测试):

TcpClient TCC=新的TcpClient(“127.0.0.1”,200);
int cOffset=0,dgramSizeInt=5000,j;
byte[]datagramByteForm=新字节[dgramSizeInt];
var dataIOStream=TCC.GetStream();

虽然(cOffset可能
bytesavable
小于dgramSizeInt。我通常使用
TcpClient
,但可以设置
TcpClient.Client.ReceiveBufferSize=20000;
缓冲区大小不是这里的问题,我已经解决了,你几乎完全正确。如果你在流中调整dgramSizeInt。阅读我会接受你的答案(int needToRead=datagramByteForm.Length;int readAmount=0;int currentRead=0;while((needToRead=needToRead-currentRead)!=0){//needToRead=needToRead-readAmount;currentRead=dataIOStream.Read(datagramByteForm,readAmount,needToRead);//读取实际数据报readAmount+=currentRead;})(您的解决方案没有重新调整stream.read中的readlength)是的,对不起,我的错误,但正如我所说,我只是写了下来,没有编译它:P(已编辑)
        TcpClient TCC = new TcpClient("127.0.0.1", 200);
        int cOffset = 0, dgramSizeInt = 5000, j;
        byte[] datagramByteForm = new byte[dgramSizeInt];

        var dataIOStream = TCC.GetStream();

        while (cOffset <= dgramSizeInt)
        {
            j = dataIOStream.Read(datagramByteForm, cOffset, dgramSizeInt-cOffset);
            cOffset += j;
        }