gpt4 book ai didi

c++ - 在调用 recv() 之前检查错误

转载 作者:可可西里 更新时间:2023-11-01 10:00:46 25 4
gpt4 key购买 nike

遇到以下问题:

我制作了一个能够使用select() 处理多个连接的服务器。但是 select 也会返回一个客户端(FD_SET 的索引),如果套接字刚刚出现“客户端断开连接”之类的错误。

是否可以在不调用 recv() 的情况下检查套接字。因为要接收,我需要从我的“BufferPool

中获取缓冲区

示例代码:

int ret = recv(client, buffer_pool->get(), BUFFER_SIZE, 0);
if(ret == -1) ... // something went wrong

那么我必须再次释放缓冲区,这几乎浪费了我池中的一个缓冲区。 (短时间)

那么不调用recv() 是不是就可以检查套接字了

最佳答案

我不确定 Windows,但是使用 getsockopt() 在 POSIX 兼容系统上工作起来就像一个魅力。虽然在你使用它之前 - 确保从池中获取缓冲区比进行额外的系统调用更昂贵。这是一个代码片段:

int my_get_socket_error(int fd)
{
int err_code;
socklen_t len = sizeof(err_code);

if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &err_code, &len) != 0)
err_code = errno;
else
errno = err_code;
return err_code;
}

更新:

根据 this document , Windows 似乎也支持它。

关于c++ - 在调用 recv() 之前检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248380/

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