【发布时间】:2012-05-21 19:28:11
【问题描述】:
我正在使用 BSD 套接字,我想使用 ::connect 连接到端口 80 上的 example.com。::socket 的手册页告诉我它返回一个有效的文件描述符,或者 -1 on错误。
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 告诉我我给了它一个错误的文件描述符,而我显然没有?
【问题讨论】: