htonl 中出现段错误
Segmentation fault occurs in 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.
正如我所说,分段错误恰好发生在该行。我想这一定是因为语法。
their_addr.sin_addr.s_addr = htonl(((struct
in_addr*)host->h_addr_list[0])->s_addr);
不是因为 h_addr_list[0]。我已经检查过它不会产生分段错误。
如何更正此语法?
htonl
是一个太简单的宏,不会导致段错误。计算参数时会出现问题。
It is not because of h_addr_list[0]
. I already checked that it doesn't generate segmentation fault.
这是一个好的开始,但还不足以得出段错误发生在其他地方的结论。应用 [0]
后发生的另一件事是其内容被强制转换为 struct in_addr*
,然后取消引用。您必须确保 h_addr_list[0]
指向有效的 struct in_addr*
.
// 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.
正如我所说,分段错误恰好发生在该行。我想这一定是因为语法。
their_addr.sin_addr.s_addr = htonl(((struct in_addr*)host->h_addr_list[0])->s_addr);
不是因为 h_addr_list[0]。我已经检查过它不会产生分段错误。
如何更正此语法?
htonl
是一个太简单的宏,不会导致段错误。计算参数时会出现问题。
It is not because of
h_addr_list[0]
. I already checked that it doesn't generate segmentation fault.
这是一个好的开始,但还不足以得出段错误发生在其他地方的结论。应用 [0]
后发生的另一件事是其内容被强制转换为 struct in_addr*
,然后取消引用。您必须确保 h_addr_list[0]
指向有效的 struct in_addr*
.