2012-08-11 68 views
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”的套接字。

谢谢。

+0

使用TCP连接到服务器的客户端的正常顺序是首先执行socket()调用来获取套接字,然后使用connect()调用来使用套接字创建到服务器的连接处理你从socket()获得的。你有一个好的插座手柄吗? – 2012-08-11 19:27:08

+0

套接字在别处创建,并且创建时没有问题。 – 2012-08-11 20:25:53

+0

另外我在连接呼叫后检查errno。我的程序是多线程的,但是如果我没有记错的话,errno的设计目标就是将多线程程序作为POSIX标准工作。 – 2012-08-11 20:27:30

回答

0

我发现这个问题:LLDB

LLDB告诉我的errno为ENOENT但是当我使用GDB(正如我清楚应该)它告诉我的errno是EINPROGRESS!它一直都可以。这是所有调试器的错。

课程:使用GDB并且从不使用LLDB。