我有这个,取自beej指南并略微改编:
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
char nombreSubscriptor[INET6_ADDRSTRLEN+sizeof(int)];
int port;
len = sizeof(addr);
if(getpeername(fdSocketDevuelto, (struct sockaddr*)&addr, &len)<0){
perror("GETPEERNAME error");
close(fdSocketDevuelto);
exit(1);
}
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
printf("Peer port : %d\n", port);
所以我运行客户端和服务器并向服务器发送消息,一切正常,显示如下
Peer IP address: 127.0.0.1
Peer port : 42639
但是,如果我关闭并打开几次(有时它会在前1-2次我尝试它,但这种情况发生的次数减少了),在某些时候我得到了这个:
GETPEERNAME error: Invalid argument
在我使用perpe并在getpeername中退出(1)之前,我得到的东西与此类似(它的数字略有变化):
Peer IP address: 2325:2ec7:c37f::
Peer port : 20423
我已经问过这里Recv gives Bad file descriptor only sometimes (run the program it works fine, sometimes it does not work),但问题是错误的,因为它不是具有失败的recv,它是getpeername函数。我这次决定再次提供适当的数据,我不确定这是否正确。
问题是:为什么会发生这种情况?为什么有时它会通过而且Ip很好,有时候不是?这是代码的两个完全不同的运行,我关闭并再次运行,并且不编译或执行任何操作。当它给我失败时,我会等待几分钟(这看起来也会不时发生变化),我可以再次运行,它再次正常运行。