【问题标题】:Segmentation fault occurs in htonlhtonl出现分段错误
【发布时间】:2018-05-25 20:39:42
【问题描述】:
// 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。

就像我说的那样,分段错误恰好发生在该行。我想这一定是因为语法。

他们的_addr.sin_addr.s_addr = htonl(((结构 in_addr*)host->h_addr_list[0])->s_addr);

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

如何纠正这种语法?

【问题讨论】:

  • 如果 their_addr.sin_addr 为 NULL 或无效指针,取消引用 s_addr 成员将导致段错误。
  • 在同一个函数中看到stringchar[] 不是很好。如果你想使用 C++,const string&amp; 是最好的参数类型。使用 C API 时,您需要像 c_str 这样的大量转换,但这至少是情境性的。

标签: c++ htonl


【解决方案1】:

htonl 是一个太简单的宏导致段错误。计算参数时会出现问题。

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

这是一个好的开始,但还不足以断定段错误发生在其他地方。在应用[0] 之后发生的另一件事是其内容被转换为struct in_addr*,然后被取消引用。您必须确保 h_addr_list[0] 指向有效的 struct in_addr*

【讨论】:

  • 那里有两个指针取消引用,任何一个都可能破坏它。如果将设置为第一个取消引用指针的临时变量添加到代码中,调试器将能够确定问题。
  • 谢谢!我以为 htonl 是一个函数,而不是宏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多