首页 文章

套接字发送和接收缓冲区

提问于
浏览
0

我试图了解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);
}

服务器:我将连接的客户端设置为 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] .

根据书:如果套接字发送缓冲区已满,客户端调用write函数将阻塞 .

但我得到了结果[客户]:Result

和服务器:Result

问题:

  • 接收缓冲区大小发送缓冲区大小<100000;但是为什么写函数不会阻塞?

  • 为什么服务器读取8192 6808 = 15000字节而不是连续读取8192字节?

1 回答

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

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

相关问题