gpt4 book ai didi

c - getpeername() 返回错误数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:21 24 4
gpt4 key购买 nike

我正在 Linux 上编写我的第一个套接字程序,并试图打印我连接到的对等点的 IP 地址和端口。我使用 getpeername() 以及 inet_ntop() 和 ntohs() 从 sockaddr_in 结构中获取数据。当我查看结果时,我得到一个 IP 地址,该地址不会转到我所知道的任何服务器(ping 失败),并表示我正在监听 netstat 表示未被使用的端口。

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

这是我的客户端程序的一个片段:

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));

最佳答案

您没有为您的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 - getpeername() 返回错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com