0
我有这样的代码:Berkeley套接字:connect()的返回-1,errno设置为ENOENT
bool CBSocketConnect(uint64_t socketID,uint8_t * IP,bool IPv6,uint16_t port){
// Create sockaddr_in6 information for a IPv6 address
int res;
if (IPv6) {
struct sockaddr_in6 address;
memset(&address, 0, sizeof(address)); // Clear structure.
address.sin6_family = AF_INET6;
memcpy(&address.sin6_addr, IP, 16); // Move IP address into place.
address.sin6_port = htons(port); // Port number to network order
res = connect((evutil_socket_t)socketID, (struct sockaddr *)&address, sizeof(address));
}else{
struct sockaddr_in address;
memset(&address, 0, sizeof(address)); // Clear structure.
address.sin_family = AF_INET;
memcpy(&address.sin_addr, IP + 12, 4); // Move IP address into place. Last 4 bytes for IPv4.
address.sin_port = htons(port); // Port number to network order
res = connect((evutil_socket_t)socketID, (struct sockaddr *)&address, sizeof(address));
}
if (NOT res || errno == EINPROGRESS)
return true;
return false;
}
随着IPv6设置为false,将IP设置为将:: ffff:127.0.0.1(IPv4的环回地址)和端口号设置为45562,res设置为-1,errno设置为ENOENT(2)。为什么会这样?
我在的平台是OSX Mountain Lion。我使用libevent版本为“2.0.19-stable”的套接字。
谢谢。
使用TCP连接到服务器的客户端的正常顺序是首先执行socket()调用来获取套接字,然后使用connect()调用来使用套接字创建到服务器的连接处理你从socket()获得的。你有一个好的插座手柄吗? – 2012-08-11 19:27:08
套接字在别处创建,并且创建时没有问题。 – 2012-08-11 20:25:53
另外我在连接呼叫后检查errno。我的程序是多线程的,但是如果我没有记错的话,errno的设计目标就是将多线程程序作为POSIX标准工作。 – 2012-08-11 20:27:30