c++ - htonl 出现段错误

标签 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套接字编程的新手,所以我很难理解许多与套接字编程相关的结构,例如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*

关于c++ - htonl 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536568/

相关文章:

c - C 中 2 字节短到 2 字节字符串?

c++ - 使用 clang 的 CMake 显示 undefined symbol ,并且使用 cl 正确链接

c++ - "new int(100)"有什么作用?

c++ - 所有线程都做同样的事情。程序文件

c++ - 我应该担心 "Conditional jump or move depends on uninitialised value(s)"吗?

C++ OpenGL 窗口工具包

c++ - 何时以及如何使用 C++ htonl 函数

与 __builtin_bswap32 相关的编译错误

c# - ntohs() 和 ntohl() 等效?