繁体   English   中英

从非阻塞套接字接收部分数据

[英]Receiving partial data from non-blocking socket

我正在用C用TCP套接字编写http服务器。由于某种原因,即使我这样调用read in loop,我也会收到部分数据。

size_t data_len = 0;
while (auto len = read(sock, buf + data_len, read_buffer_size)) {
  if (len < 0) {
    if(errno == EWOULDBLOCK) {
      break;
    }
  }
  data_len += len;
}

我使用的套接字选项:

setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void *) &new_buf_size, sizeof(new_buf_size));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &new_buf_size, sizeof(new_buf_size));
setsockopt(sock, SOL_SOCKET, SO_DONTROUTE, (void *) &turn_on, sizeof(turn_on));
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &turn_on, sizeof(turn_on));
setsockopt(sock, SOL_SOCKET, SOCK_NONBLOCK, (void *) &turn_on, sizeof(turn_on));
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);

有什么想法我做错了吗?

您正在将其设置为非阻塞,然后在阻塞时不再继续读取...,因此其余数据稍后会传入,但您已经不在循环中了。 重要的是要记住,TCP是字节流,并且在每个写调用中发送的字节数与在每个读调用中读取的字节数之间没有相关性,只是它们最终(给定的无限时间)是相同的。 您没有给它无限的时间。

删除break语句,您将看到将获得所有数据(尽管循环永远不会结束)。 您需要定义一个协议,以便知道需要多少数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM