套接字发送和接收缓冲区

时间:2018-05-30 02:42:35

标签: c linux sockets networking tcp

我试着了解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

问题:

  1. 接收缓冲区大小+发送缓冲区大小< 100000;但是为什么写函数不会阻塞?
  2. 为什么服务器读取8192 + 6808 = 15000字节而不是连续读取8192字节?

1 个答案:

答案 0 :(得分:1)

  1. 此处没有证据表明客户端写入没有阻止。相反,所有写入都是100,000个字节,除了最后一个,当你用完输入时,表明必须已经阻塞,将所有数据传输到更小的套接字缓冲区

  2. TCP分段和IP数据包,通过线路发送的数据。您无法控制该过程。在任何情况下,read()都可以将任意数量的字节从1传输到所提供的计数,或者在非阻塞模式下向上传输零。它是流协议,而不是消息传递协议。关于任何个人read()一次返回的数量,没有其他保证。