【发布时间】:2018-11-08 18:36:58
【问题描述】:
我试图了解 Socket-Send(Receive)-Buffer 的概念。我写了这些代码: 客户:
int client = socket(AF_INET, SOCK_STREAM, 0);
int s = getsockopt(client, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &len);
int status = connect(client, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
printf("The send buff size is : %d.\n", sendBuffSize);
char buf[100000];
int n, wn;
int fd = open("./1.txt", O_RDONLY);
while ((n = read(fd, buf, sizeof(buf))) > 0) {
wn = write(client, buf, n);
printf("Write %d bytes.\n", wn);
}
Server:我将连接的客户端设置为Non-block,并将这个客户端加入到epoll中。一旦客户端向服务器发送数据,我就让主线程进入休眠[十秒] .
char buf[8192];
sleep(10);
int rn;
while ((rn = read(events[i].data.fd, buf, sizeof(buf))) > 0) {
printf("Read %d bytes.\n", rn);
}
客户端发送缓冲区大小为16384,服务器接收缓冲区大小为20000[setsockopt]。
书上说:如果socket发送缓冲区满了,客户端调用write函数会阻塞。
但我得到了结果 [Client] : Result
还有服务器: Result
问题:
- 接收缓冲区大小 + 发送缓冲区大小
- 为什么服务器读取 8192 + 6808 = 15000 字节而不是连续读取 8192 字节?
【问题讨论】:
-
这是一个好奇的事情,还是您正在尝试设计一个实际上依赖于缓冲区大小的程序?
-
感谢您的回复。我是初学者。我只是想了解socket缓冲区的概念,所以我写了这个程序来检查我是否真的理解它。但是结果让我感到困惑。
-
我认为 Linux 在套接字缓冲区大小中包含每个数据包的一些开销。对于大多数编程,您需要知道 有一个套接字缓冲区,但确切的大小等是不可靠的。
-
谢谢,我会记住的。
标签: c linux sockets networking tcp