c - 伯克利套接字: connect() returns -1 with errno set to ENOENT

标签 c sockets berkeley-sockets

我有这个代码:

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”的套接字。

谢谢。

最佳答案

我发现问题:LLDB

LLDB 告诉我 errno 是 ENOENT,但是当我使用 GDB 时(我显然应该这么做)它告诉我 errno 是 EINPROGRESS!一直都还好。这都是调试器的错。

教训:使用 GDB,切勿使用 LLDB。

关于c - 伯克利套接字: connect() returns -1 with errno set to ENOENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11916719/

相关文章:

c - 使用 Xlib 生成 Perlin 噪声

c++ - 连接到同一网络中的命名管道,无需管理员权限

c++ - 为什么阻塞套接字会重复返回 0 长度数据?

api - 如何测试Berkeley套接字(BSD)API?

c++ - 伯克利套接字 : recv system call

c - 文件传输程序中的 send() 和 sendto() 阻塞

c - 如何在 C 中编写 getline 函数?

c - 使用 SOCK_DGRAM 时使用 recvfrom 接收空负载?

c# - .NET 新手套接字问题

c - 将套接字绑定(bind)到 IPv6 地址