c++ -::socket 返回 0 并且::connect 将 errno 设置为 EBADF

标签 c++ sockets

我正在使用 BSD 套接字,并且我想使用 ::connect 连接到端口 80 上的 example.com::的手册页socket 告诉我它要么返回一个有效的文件描述符,要么返回 -1 错误。

auto fd = ::socket(AF_INET, SOCK_STREAM, 0);

struct ::sockaddr_in addr;
::bzero(&addr, sizeof(addr));
addr.sin_family = family_;

struct ::hostent* hostent = ::gethostbyname(host.c_str());
::bcopy(hostent->h_addr, &addr.sin_addr.s_addr, hostent->h_length);
addr.sin_port = port;

auto err = ::connect(fd,
                     reinterpret_cast<struct ::sockaddr*>(&addr),
                     sizeof(addr));

fd == 0,因此 ::socket 成功(否则它会返回 -1)。但是,err == -1errno 设置为 EBADF,表明 fd 是一个错误的文件描述符.

这里可能发生了什么?为什么 ::connect 告诉我我给了它一个错误的文件描述符,而我显然没有?

最佳答案

您应该确认socket实际上返回0?除非您关闭了标准文件描述符,否则这是非常不寻常的。确保在套接字调用后立即检查它,以防它被其他调用损坏。

关于c++ -::socket 返回 0 并且::connect 将 errno 设置为 EBADF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684153/

相关文章:

c++ - 我可以在 #define 函数中使用 Visual Studio 调试器吗?

c++ - 编译器编译一个 'io_service_' 变量显示为 : cannot appear in a constant-expression

c++ - 用 C 或 C++ 编写引导加载程序?

类的 Java 菜单栏操作

c - 绑定(bind)到特定地址但随机端口 Linux

c# - 使用异步套接字的回调

c++ - 带有可互换字母的字符串

c++ - 避免不同线程阻塞碰撞的简单方法?

Java - 套接字 - 显示服务器上所有文件的名称

python - 从单个长字符串创建列表