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

标签 c++ windows sockets recv

遇到以下问题:

我制作了一个能够使用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/

相关文章:

Windows 批处理 : "if exist" -- path exists but it says no -- why?

java - 服务器与客户端通信问题

c++ - 使用 shared_ptr<void> 初始化结构

c++ - 如何匿名声明 std::thread?

c# - 如何为 .net Windows 应用程序添加一个条目到 'add/remove programs'

sockets - lwip stm32-HTTP请求失败

python - 如何在重新连接测试的单元测试中终止套接字

c++ - 派生类中虚函数调用的优化

c++ - 递归二进制搜索 'Out of Range'

c++ - cmake - find_library - 自定义库位置