Ошибка сегментации происходит в htonl
// 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.
Как я уже сказал, ошибка сегментации происходит именно на этой линии. И я думаю, что это должно быть из-за синтаксиса.
they_addr.sin_addr.s_addr = htonl(((struct in_addr*)host->h_addr_list[0])->s_addr);
Это не из-за h_addr_list[0]. Я уже проверил, что это не генерирует ошибку сегментации.
Как я могу исправить этот синтаксис?
1 ответ
htonl
слишком простой макрос, чтобы вызвать segfault. Проблема возникает, когда аргументы вычисляются.
Это не из-за
h_addr_list[0]
, Я уже проверил, что это не генерирует ошибку сегментации.
Это хорошее начало, но этого недостаточно, чтобы сделать вывод, что segfault происходит где-то еще. Еще одна вещь, которая происходит после [0]
применяется то, что его содержание приведено к struct in_addr*
, а затем разыменовывается. Вы должны убедиться, что h_addr_list[0]
указывает на действительный struct in_addr*
,