TCP Socket通信限制

3

TCP客户端接收数据的大小是否有限制?使用TCP套接字通信时,服务器正在发送更多数据,但客户端仅获取了4K并停止。


1
现在来吧,好好想想。那样会让互联网变得非常无聊,不是吗? - spender
你能在这里发布一些客户端的代码吗? - Dmitry Yudakov
5个回答

7
我猜你在执行一次发送和一次接收操作。你需要做多次读取,因为不能保证从套接字的单次读取中能够获取所有数据。 Receive方法会读取所有可用的数据,但只会返回部分数据以便程序使用。请注意,它会读取缓冲区的大小限制。

+1 可能是正确的,因为缺乏细节。另一个不太可能的可能性是,在最后一次发送后,他们没有进行最终刷新,而 Nagle 算法需要花费很长时间来发送剩余的内容。 - Kennet Belenky
听这个人说!众所周知,read()write()不能保证读取和填充整个缓冲区或写出整个缓冲区。你可能需要缓冲发送和接收的内容,或在同步应用程序中实现send_all()receive_all()函数。 - Eric des Courtis

2

您可以考虑将读/写操作分割成多个调用。我过去确实遇到了一些与 TcpClient相关的问题。为了解决这个问题,我们使用一个包装的流类,其中包含以下read/write方法:

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.

2
不,应该没问题。我怀疑你从客户端读取的代码存在缺陷,但如果没有实际展示,很难说。

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

1

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

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

因此,如果您发送速度比释放速度快,可能会使此缓冲区过载,从而导致错误!


我认为这是主要问题。我们应该更改注册表键来解决这个问题吗? - Kubi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接