我正在使用 BSD 套接字,我想用来::connect
连接到example.com
端口 80。手册页::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
告诉我我给了它一个错误的文件描述符,而我显然没有?