我试着了解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);
}
服务器:我将连接的客户端设置为非阻止,并将此客户端添加到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]。
根据书中的说明:如果套接字发送缓冲区已满,客户端调用write函数将阻塞。
但是我得到了结果[客户]: Result
服务器: Result
问题:
答案 0 :(得分:1)
此处没有证据表明客户端写入没有阻止。相反,所有写入都是100,000个字节,除了最后一个,当你用完输入时,表明必须已经阻塞,将所有数据传输到更小的套接字缓冲区
TCP分段和IP数据包,通过线路发送的数据。您无法控制该过程。在任何情况下,read()
都可以将任意数量的字节从1传输到所提供的计数,或者在非阻塞模式下向上传输零。它是流协议,而不是消息传递协议。关于任何个人read()
一次返回的数量,没有其他保证。