Сокеты Беркли: 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".

Спасибо.

1 ответ

Решение

Я нашел проблему: LLDB

LLDB говорил мне, что errno был ENOENT, но когда я использовал GDB (как я, очевидно, должен), он сказал мне, что errno был EINPROGRESS! Все было в порядке. Это была вина всех отладчиков.

Урок: используйте GDB и никогда LLDB.

Другие вопросы по тегам