c - getpeername() 返回错误数据

标签 c linux sockets

我正在 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/

相关文章:

C 在主函数中显示(打印),而在自定义函数中返回值

php - Node js调用socket.io函数的用法

windows - 免费网络监控器

python - 如何保持Python服务器连接打开,直到客户端完成它?

c - 线程未按正确顺序打印

c - 为什么这个程序中的for循环是不确定的?

python - 我可以将 c++ 模板类导出到 C,然后再导出到带有 ctypes 的 python 吗?

linux - shell脚本删除不同文件夹中除最后更新文件之外的所有文件

linux - 用于从原始文本文件中的列中删除字符的系统命令

linux - 如何只打印包含特定字符串的文件的文件名部分?