我正在使用 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 == -1
和 errno
设置为 EBADF
,表明 fd
是一个错误的文件描述符.
这里可能发生了什么?为什么 ::connect
告诉我我给了它一个错误的文件描述符,而我显然没有?
最佳答案
您应该确认socket
实际上返回0?除非您关闭了标准文件描述符,否则这是非常不寻常的。确保在套接字调用后立即检查它,以防它被其他调用损坏。
关于c++ -::socket 返回 0 并且::connect 将 errno 设置为 EBADF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684153/