【发布时间】:2016-02-10 04:21:02
【问题描述】:
我有一个问题:
我们可以为客户端和服务器设置不同的套接字缓冲区大小吗?例如 将服务器上的发送和接收缓冲区设置为 2048,客户端设置为 13312 会有任何问题(服务器上的缓冲区比 clent 小)?如果是,会有什么问题?
【问题讨论】:
-
给我们看一个例子..
标签: sockets tcp serversocket
我有一个问题:
我们可以为客户端和服务器设置不同的套接字缓冲区大小吗?例如 将服务器上的发送和接收缓冲区设置为 2048,客户端设置为 13312 会有任何问题(服务器上的缓冲区比 clent 小)?如果是,会有什么问题?
【问题讨论】:
标签: sockets tcp serversocket
我认为您是在询问应用程序中的缓冲区。操作系统使用的缓冲区是另一回事。
在客户端和服务器上使用不同长度的缓冲区是合法的。实际上它必须是合法的,因为例如网络浏览器在网络服务器中没有信息缓冲区大小,而网络服务器不知道客户端缓冲区。
但您必须记住,TCP 是一种面向流的协议,它不保留消息边界。
例如让客户端有一个大小为 10 字节的缓冲区并发送 3 条数据:
send(sock1, "0123456789", 10, 0);
send(sock1, "ABCDEFGHIJ", 10, 0);
send(sock1, "abcdefghij", 10, 0);
数据以流的形式传输,是否通过 3 个 IP 数据包传输取决于底层 TCP 堆栈:
0123456789 ABCDEFGHIJ abcdefghij
或一大包:
0123456789ABCDEFGHIJabcdefghij
甚至更奇怪的东西:
0123456789A BCDEFGHIJab cdefghij
接收端的操作系统在接收到数据时将所有接收到的数据存储在其内部缓冲区中。当应用程序调用receive 时,操作系统将数据复制到应用程序缓冲区。如果接收应用程序的缓冲区大于已接收数据的大小,则所有数据都将复制到应用程序缓冲区。如果应用程序缓冲区较小,则操作系统仅复制适合缓冲区的数据,剩余数据将在下一次 receive 调用中复制。
【讨论】: