getaddrinfo()上的Seg错误

Seg Fault on getaddrinfo()

本文关键字:Seg 错误 上的 getaddrinfo      更新时间:2023-10-16

我的getaddrinfo调用出现分段错误,无法找出原因。它发生在我的服务器和客户端上。某些代码(服务器端(是-

class TcpServer {
public:
    TcpServer(int);
    ~TcpServer();
    void launchServer();
    void communicate();
private:
    const char* port;
    int fd;
    int comm_fd;
};

在tcpserver.cpp-中

void TcpServer::launchServer() {
    int status;
    struct addrinfo hints;
    struct addrinfo *servinfo;  //will point to the results
    //store the connecting address and size
    struct sockaddr_storage their_addr;
    socklen_t their_addr_size;
    //socket infoS
    memset(&hints, 0, sizeof hints); //make sure the struct is empty
    hints.ai_family = AF_INET;  //local address
    hints.ai_socktype = SOCK_STREAM; //tcp
    hints.ai_flags = AI_PASSIVE;     //use local-host address
    //get server info, put into servinfo
    if ((status = getaddrinfo("127.0.0.1", port, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo error: %sn", gai_strerror(status));
        exit(1);
    }

主要-

TcpServer server(4950);
server.launchServer();

传递给构造函数的int被广播到端口的const char*

当我运行gdb时,它会给我一个-的回溯

#0  0xb7dca737 in getaddrinfo (name=0x8054824 "127.0.0.1", 
    service=0x1356 <Address 0x1356 out of bounds>, hints=0xbffff20c, 
    pai=0xbffff234) at ../sysdeps/posix/getaddrinfo.c:2080
#1  0x08050f79 in TcpServer::launchServer (this=0xbffff304) at tcpserver.cpp:25
#2  0x0804eae9 in main (argc=1, args=0xbffff3f4) at mainserver.cpp:47

所以"地址0x1356越界"让我相信端口出了问题,但我不知道可能出了什么问题。如果有人能指出错误的地方,我将不胜感激。谢谢你的帮助。

getaddrinfo("127.0.0.1", port, &hints, &servinfo)
                          ^

那应该是char *。我猜您正在传递一个整数,并强制库访问一个无效地址。

编辑

根据Blagovest Buyukliev的评论,我相信你在构造函数this->port = (const char*) port中做了这样的事情。

您需要使用一些东西(可能是snprintf?(将该整数转换为char *。简单地铸造是不行的

是否应该通过引用而不是值传递port,即&port?0x1356与4950的值相同,4950是您尝试使用的端口号。

edit:好吧,我认为它应该是一个字符串,而不是指针对int。我将保留我的答案,因为它显示端口值被错误地解释为地址。

您正在设置一个指向端口的指针,但没有为它分配内存。(至少我在您列出的代码中看不到。(

端口应该是一个字符串(即char数组(,而不是指向char的指针。也不是整数。