gpt4 book ai didi

c - C 套接字上的 ioctl() 的 FIONREAD 可靠吗?

转载 作者:行者123 更新时间:2023-11-30 14:56:52 25 4
gpt4 key购买 nike

我在以下代码中看到了奇怪的行为:

int len;
ioctl(conn_fd, FIONREAD, &len);

您可能想象到的常见代码在此之前(它是一个玩具网络服务器):

...
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(sock_fd, 5);
int conn_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &client_addr_size);

不寻常的行为是,当我使用curl向我的玩具网络服务器发出请求时,一切都很完美,并且len是请求的确切大小。当我使用 Chrome、Postman 或 wget 时,len 为 0。由于 len 为 0,我的代码将其视为空响应,并且不会消耗该请求。

为了验证是否确实存在数据(除了 curl 有效的事实之外),我按照以下代码进行操作:

char full_request[16384];
int bytes_read = read(conn_fd, full_request, 16383);

令我高兴的是,输出 full_request 给了我完整的请求,无论它是curl、Chrome、Postman还是wget。

什么给了?我对 ioctl 的调用不可信吗?有没有更好的方法来了解传入数据的大小以便我可以使用它?

编辑 EJP:

 char *full_request = malloc(1 * sizeof(char));
*full_request = '\0';

for (;;) {
char buf[64];
int bytes_read;
int new_len;

bytes_read = recv(conn_fd, buf, 63, 0);
buf[bytes_read] = '\0';

if (bytes_read <= 0) break;

new_len = strlen(full_request) + bytes_read + 1;

full_request = realloc(full_request, new_len * sizeof(char));
strcat(full_request, buf);
}

最佳答案

您的推理问题是 read() 会阻塞,直到数据可用、流结束或发生错误为止。因此,它确实返回数据这一事实并不表明 FIONREAD 在您调用它时是错误的。很少有充分的理由使用 FIONREAD。

您也不能依赖一次读取返回完整的请求。它只需要传输至少一个字节。你必须循环。

关于c - C 套接字上的 ioctl() 的 FIONREAD 可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com