gpt4 book ai didi

c++ - 读句柄问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:27 25 4
gpt4 key购买 nike

我正在使用 epoll 进行网络编程,我有这段代码...

int read = read(socket, buf, bufsize);

我有一个巨大的缓冲区大小,我假设它会接收客户端发送的所有内容。然而,我开始面临数据包分段等问题。

一个例子是,如果客户端发送了 500 字节,但它以某种方式进入了两个 250 字节的数据包,那么就没有办法处理这种情况。

网上查了一下,找到了这段代码

int handle_read(client *cli, struct epoll_event *ev) {
size_t len = 4096;
char *p;
ssize_t received;

cli->state = 1;
if (cli->buffer != NULL) {
//free(cli->buffer);
//printf("Buff not null %s\n", cli->buffer);
}

//allocate space for data
cli->buffer = (char*)malloc( (size_t)(sizeof(char) * 4096) );
p = cli->buffer;

do { //read until loop conditions
received = recv(ev->data.fd, p, len, 0);
if (received < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
//if error, remove from epoll and close socket
printf("Handle error!!!\nClient disconnected!\n");
epoll_ctl(epollfd, EPOLL_CTL_DEL, ev->data.fd, ev);
close(ev->data.fd);
}
p = &cli->buffer[received];
} while (received >= len && errno != EAGAIN && errno != EWOULDBLOCK);

return received;
}

你们认为它处理接收时可能发生的所有异常吗?另外,您能否提供处理套接字异常的教程或示例?在线示例代码未涵盖详细信息。提前致谢

最佳答案

recv 可以返回三种 中的任何一种,您的代码需要正确处理每一种:

1) 正数。这意味着它读取了一些字节。

2) 负数。这意味着发生了“错误”。

3) 零。这意味着连接的另一端在套接字上执行了成功的 shutdown()(或 close())。 (通常,从 read() 或 recv() 返回 0 意味着 EOF。)

“错误”情况进一步分解为“EAGAINEWOULDBLOCK”和“其他所有情况”。前两个只是表示它是一个非阻塞套接字,此时没有数据给你。您可能想返回并再次调用 poll()(或 select() 或 epoll())以避免忙等待...

"Everything else"表示真正的错误。你也需要处理这些;查看POSIX spec for recv()获取完整列表。

考虑到所有这些,我会说您的示例代码很糟糕,原因有几个。它不能正确处理 0(关闭的连接)。它不处理任何错误。当 recv() 返回 EAGAIN/EWOULDBLOCK 时,它会执行一个忙循环。

哦,它使用了 sizeof(char),这是一个明确的标志,它是由不熟悉 C 或 C++ 编程语言的人编写的。

关于c++ - 读句柄问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420164/

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