分段错误发生在htonl

时间:2018-05-25 20:39:43

标签: c++ 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套接字编程的新手,所以我很难理解许多与socket编程相关的结构,比如in_addr。

就像我说的那样,分段错误恰好发生在那条线上。我想这肯定是因为语法。

  

their_addr.sin_addr.s_addr = htonl(((struct   一个in_addr *)宿主&GT; h_addr_list [0]) - &GT; s_addr);

这不是因为h_addr_list [0]。我已经检查过它没有产生分段错误。

如何更正此语法?

1 个答案:

答案 0 :(得分:3)

htonl太简单了,导致段错误。计算参数时会出现问题。

  

这不是因为h_addr_list[0]。我已经检查过它不会产生分段错误。

这是一个良好的开端,但仅仅断定segfault在其他地方发生是不够的。应用[0]后发生的另一件事是将其内容强制转换为struct in_addr*,然后取消引用。您必须确保h_addr_list[0]指向有效的struct in_addr*