Ошибка сегментации происходит в htonl - PullRequest
0 голосов
/ 25 мая 2018
// something    
proxyRequest(setRequestFormat(request), respondBuffer, gethostbyname(hostname.c_str()));
// something

int proxyRequest(string request, char buffer[], struct hostent* host){
        int sockfd;
        struct sockaddr_in their_addr;
        if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
            perror("Socket generating failed");
            return -1;
        }
        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(SERVERPORT);
        their_addr.sin_addr.s_addr = htonl(((struct in_addr*)host->h_addr_list[0])->s_addr); // Here is where segmentation fault occurs
        if(connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1){
            perror("Connection failed");
            return -1;
        }
        cout << request.c_str() << endl;
        write(sockfd, request.c_str(), BUFSIZE);
        read(sockfd, buffer, BUFSIZE);
        cout << buffer << endl;
        close(sockfd);
        return 0;
    }

Привет.Я делаю основной прокси-сервер.Я новичок в программировании сокетов Cpp, поэтому мне было трудно разобраться во многих структурах, связанных с программированием сокетов, таких как in_addr.

Как я уже сказал, ошибка сегментации возникает именно в этой строке.И я думаю, что это должно быть из-за синтаксиса.

its_addr.sin_addr.s_addr = htonl (((struct in_addr *) host-> h_addr_list [0]) -> s_addr);

Это не из-заh_addr_list [0].Я уже проверил, что это не генерирует ошибку сегментации.

Как я могу исправить этот синтаксис?

1 Ответ

0 голосов
/ 25 мая 2018

htonl - слишком простой макрос, чтобы вызвать segfault.Проблема возникает, когда аргументы вычисляются.

Это не из-за h_addr_list[0].Я уже проверил, что он не генерирует ошибку сегментации.

Это хорошее начало, но этого недостаточно, чтобы сделать вывод, что segfault происходит где-то еще.Еще одна вещь, которая происходит после применения [0], заключается в том, что ее содержимое приводится к struct in_addr*, а затем разыменовывается.Вы должны убедиться, что h_addr_list[0] указывает на действительный struct in_addr*.

...