getpeername()返回错误的数据

Chr*_*ieb 0 c sockets linux

我正在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));
Run Code Online (Sandbox Code Playgroud)

Dea*_*ing 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 正是在这样的时刻,我想起了为什么我对C有强烈的厌恶。 (2认同)