遇到以下问题:
我制作了一个能够使用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/