C# TCP套接字通信限制

C# TCP套接字通信限制,c#,sockets,network-programming,C#,Sockets,Network Programming,TCP客户端可以接收的数据大小是否有任何限制。 使用TCP套接字通信,服务器正在发送更多数据,但客户端只收到4K并停止。我猜您正在执行的正是1Send和1Receive 您需要进行多次读取,不能保证从套接字进行的一次读取将包含所有内容 Receive方法将读取尽可能多的可用数据,直到缓冲区的大小。但是,当它有一些数据时,它会返回,以便您的程序可以使用它。不,应该可以。我怀疑您从客户端读取的代码有缺陷,但如果您没有实际显示它,很难说。没有限制,TCP套接字是一个流。理论上,TCP对数据没有限制,但

TCP客户端可以接收的数据大小是否有任何限制。
使用TCP套接字通信,服务器正在发送更多数据,但客户端只收到4K并停止。

我猜您正在执行的正是1
Send
和1
Receive

您需要进行多次读取,不能保证从套接字进行的一次读取将包含所有内容


Receive
方法将读取尽可能多的可用数据,直到缓冲区的大小。但是,当它有一些数据时,它会返回,以便您的程序可以使用它。

不,应该可以。我怀疑您从客户端读取的代码有缺陷,但如果您没有实际显示它,很难说。

没有限制,TCP套接字是一个流。

理论上,TCP对数据没有限制,但由于我们受到物理资源(即内存)的限制,Microsoft Winsock等实现者利用了一种称为“TCP窗口大小”的东西

这意味着,例如,当您使用Winsock的send()函数发送某些内容时(未在套接字处理程序上设置任何选项),数据将首先复制到套接字的临时缓冲区。只有当接收方确认他已获得该数据时,Winsock才会再次使用该内存


因此,您可能会通过发送速度快于释放速度而使此缓冲区溢出,然后出错TcpClient方面遇到过一些问题。为了解决这个问题,我们使用了一个具有以下
读/写
方法的包装流类:

public override int Read(byte[] buffer, int offset, int count)
{
    int totalBytesRead = 0;
    int chunkBytesRead = 0;
    do
    {
        chunkBytesRead = _stream.Read(buffer, offset + totalBytesRead, Math.Min(__frameSize, count - totalBytesRead));
        totalBytesRead += chunkBytesRead;
    } while (totalBytesRead < count && chunkBytesRead > 0);
    return totalBytesRead;
}

    public override void Write(byte[] buffer, int offset, int count)
    {
        int bytesSent = 0;
        do
        {
            int chunkSize = Math.Min(__frameSize, count - bytesSent);
            _stream.Write(buffer, offset + bytesSent, chunkSize);
            bytesSent += chunkSize;
        } while (bytesSent < count);
    }

//_stream is the wrapped stream
//__frameSize is a constant, we use 4096 since its easy to allocate.
public override int Read(字节[]缓冲区、int偏移量、int计数)
{
int totalBytesRead=0;
int chunkBytesRead=0;
做
{
chunkBytesRead=_stream.Read(缓冲区,偏移量+totalBytesRead,Math.Min(uu frameSize,count-totalBytesRead));
totalBytesRead+=chunkBytesRead;
}while(totalBytesRead0);
返回totalBytesRead;
}
公共重写无效写入(字节[]缓冲区、整数偏移量、整数计数)
{
int-bytesSent=0;
做
{
int chunkSize=Math.Min(uu frameSize,count-bytesSent);
_stream.Write(缓冲区、偏移量+字节数、chunkSize);
bytesSent+=块大小;
}while(bytesSent
现在就来吧。想想看。那会让互联网变成一个非常无聊的地方,不是吗?你能在这里发布一些客户的代码吗?我认为这是主要问题。我们是否应该更改注册表项来解决此问题?+1可能是正确的,因为缺少详细信息。另一种不太可能的情况是,他们在最后一次发送后没有进行最后一次刷新,而Nagle算法正在利用它的甜蜜时间发送其余的。听这个家伙说!这是一个众所周知的事实,
read()
write()
不能保证读取和填充整个缓冲区或写出整个缓冲区。您可能需要缓冲发送的内容,或者在同步应用程序中实现
send\u all()
receive\u all()
函数。