Я работаю над интерфейсом сокета, где приложение пытается подключиться к другому, это моя инициализация сокета:

const char* pszLocalHost = "localhost";

int intSocket = socket(AF_INET, SOCK_STREAM, 0);

if ( intSocket == 0 ) {
    clsDebugService::exitWhenDebugQueueEmpty("Failed to create socket!");
}    
struct hostent* pHostEntry = gethostbyname(pszLocalHost);

if ( pHostEntry == nullptr ) {
    clsDebugService::exitWhenDebugQueueEmpty("Unable to resolve ip address!");
}
//Initliase and get address of localhost
struct sockaddr_in srvAddr;
bzero((char*)&srvAddr, sizeof(srvAddr));
//Set-up server address    
memcpy(&srvAddr.sin_addr, pHostEntry->h_addr_list[0], pHostEntry->h_length);
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(clsSocketThread::mscuint16Port);
char* pszIP =  inet_ntoa(srvAddr.sin_addr);

if ( pszIP != nullptr ) {
    qdbg() << "Setting up socket on ip: " << pszIP 
           << ", port: " << clsSocketThread::mscuint16Port
           << ((strPurpose.isEmpty() == true) ? "" : strPurpose);
}
socklen_t tSvrAddr = sizeof(srvAddr);
int intRC;
if ( blnIsModule == true ) {
    if ( inet_pton(AF_INET, pszLocalHost, &srvAddr.sin_addr) <= 0 ) {
        clsDebugService::exitWhenDebugQueueEmpty("Invalid address not supported!");
    }
    intRC = ::connect(intSocket, (const struct sockaddr*)&srvAddr, tSvrAddr);
}

Используя отладчик, я отследил проблему до вызова inet_pton, он возвращает 0, что в соответствии с: https://man7.org/linux/man-pages/man3/ inet_pton.3.html

Означает: 0 возвращается, если src не содержит символьной строки, представляющей действительный сетевой адрес в указанном семействе адресов.

Вопрос в том, почему?

0
SPlatten 28 Окт 2020 в 11:14

1 ответ

Лучший ответ

В том же руководстве четко указано, что первым аргументом должен быть либо адрес IPv4 в форме «ddd.ddd.ddd.ddd», либо адрес IPv6. Поскольку localhost не является ни одним из них, вызов не выполняется. Однако использование "127.0.0.1" должно работать.

Вот цитата по IPv4 из руководства:

Эта функция преобразует символьную строку src в структуру сетевого адреса в семействе адресов af, а затем копирует структуру сетевого адреса в dst. Аргумент af должен быть AF_INET или AF_INET6. dst записывается в сетевом порядке байтов.

В настоящее время поддерживаются следующие семейства адресов:

AF_INET src указывает на символьную строку, содержащую сетевой адрес IPv4 в десятичном формате с точками, «ddd.ddd.ddd.ddd», где ddd - десятичное число до трех цифр в диапазоне от 0 до 255. Адрес преобразуется в struct in_addr и копируется в dst, длина которого должна быть sizeof (struct in_addr) (4) байтов (32 бита).

0
AVH 28 Окт 2020 в 08:24