我有一个问题:
我们可以为客户端和服务器设置不同的套接字缓冲区大小吗?例如 将发送和接收缓冲区设置为2048在服务器和13312在客户端将有任何问题(服务器上的缓冲区大小比clent小)?如果是,那么问题是什么?
答案 0 :(得分:2)
我认为您在询问应用程序中的缓冲区。操作系统使用的缓冲区是另一回事。
在客户端和服务器上使用不同长度的缓冲区是合法的。实际上它必须是合法的,因为例如Web浏览器在Web服务器中没有信息缓冲区大小,Web服务器也不知道客户端缓冲区。
但是你必须记住,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
接收方的OS在接收到数据时将所有接收到的数据存储在其内部缓冲区中。应用程序调用{{1}}时,OS将数据复制到应用程序缓冲区。如果接收应用程序的缓冲区大于已接收数据的大小,则将所有数据复制到应用程序缓冲区。如果应用程序缓冲区较小,则OS仅复制适合缓冲区的数据,剩余数据将在下一次receive
调用中复制。