getpeername()返回错误的数据

时间:2010-09-09 23:50:48

标签: 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));

1 个答案:

答案 0 :(得分:5)

您没有为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都会返回您应该检查的错误代码。