【问题标题】:getpeername() Returns Wrong Datagetpeername() 返回错误数据
【发布时间】:2010-09-09 23:50:47
【问题描述】:

我正在 Linux 上编写我的第一个套接字程序,并试图打印我已连接到的对等方的 IP 地址和端口。我使用 getpeername() 以及 inet_ntop() 和 ntohs() 从 sockaddr_in 结构中获取数据。当我查看结果时,我得到了一个 IP 地址,它没有连接到我知道的任何服务器(ping 失败),并说我正在侦听 netstat 说没有被使用的端口。

我做错了什么?我应该得到 130.215.28.181:39000,但每次运行程序时我都会得到 209.94.72.137:18825。查看 netstat 表明我确实在监听 39000 端口。

这是我的客户端程序中的一个 sn-p:

connect(sockfd,&serv_addr,sizeof(serv_addr))

// print welcome message
char ipstr[INET6_ADDRSTRLEN];
bzero(ipstr, 50);
struct sockaddr_in *address;
socklen_t address_len = sizeof(*address);
getpeername(sockfd, (struct sockaddr *) address, &address_len);
inet_ntop(AF_INET, &address->sin_addr, ipstr, sizeof(ipstr));
printf("Connection established successfully with %s:%i!\n", ipstr, ntohs(address->sin_port));

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    您没有为sockaddr_in 结构分配任何内存,您只是将一个指针传递给某个随机内存位置。而是在栈上分配地址结构:

    struct sockaddr_in addr;
    socklen_t addr_len = sizeof(addr);
    int err = getpeername(sockfd, (struct sockaddr *) &addr, &addr_len);
    if (err != 0) {
       // error
    }
    

    您还应该检查记录的每个函数的返回值,以返回错误代码。特别是,connectgetpeername 都返回您应该检查的错误代码。

    【讨论】:

    • 正是在这样的时刻,我才想起为什么我对 C 有强烈的反感。
    • 如果地址结构实际上是sockaddr_in6,这可能会很糟糕
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2017-08-22
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多