C 检索已重置连接的客户端的ip地址
我有一段代码,当客户端关闭或失去连接时,它会获取客户端的ipC 检索已重置连接的客户端的ip地址,c,linux,sockets,C,Linux,Sockets,我有一段代码,当客户端关闭或失去连接时,它会获取客户端的ip char buffer[80]; ssize_t bread; struct sockaddr_in peer; socklen_t peer_len; peer_len = sizeof(peer); memset(&buffer, 0, sizeof(buffer)); bread = read(connectlist[listnum], buffer, 80); if (bread < 0) { if(g
char buffer[80];
ssize_t bread;
struct sockaddr_in peer;
socklen_t peer_len;
peer_len = sizeof(peer);
memset(&buffer, 0, sizeof(buffer));
bread = read(connectlist[listnum], buffer, 80);
if (bread < 0)
{
if(getpeername(connectlist[listnum],(struct sockaddr *) &peer, &peer_len) == -1){
perror("getpeername() failed");
}
printf("Connection Reset From IP: %s\n", inet_ntoa(peer.sin_addr));
_Print_To_File(inet_ntoa(peer.sin_addr));
close(connectlist[listnum]);
close(connectlist[listnum]);
connectlist[listnum] = 0;
}
if(bread == 0)
{
if(getpeername(connectlist[listnum],(struct sockaddr *) &peer, &peer_len) == -1){
perror("getpeername() failed");
}
printf("Connection Closed From IP: %s\n", inet_ntoa(peer.sin_addr));
_Print_To_File(inet_ntoa(peer.sin_addr));
close(connectlist[listnum]);
connectlist[listnum] = 0;
}
char缓冲区[80];
烤面包;
对等中的结构sockaddr_;
socklen_u t peer_len;
peer_len=sizeof(peer);
memset(&buffer,0,sizeof(buffer));
bread=read(connectlist[listnum],缓冲区,80);
如果(面包<0)
{
if(getpeername(connectlist[listnum],(struct sockaddr*)和peer,&peer\u len)=-1){
perror(“getpeername()失败”);
}
printf(“从IP重置连接:%s\n”,inet_ntoa(peer.sin_addr));
_打印到文件(inet_ntoa(peer.sin_addr));
关闭(connectlist[listnum]);
关闭(connectlist[listnum]);
connectlist[listnum]=0;
}
如果(面包=0)
{
if(getpeername(connectlist[listnum],(struct sockaddr*)和peer,&peer\u len)=-1){
perror(“getpeername()失败”);
}
printf(“从IP关闭的连接:%s\n”,inet_ntoa(peer.sin_addr));
_打印到文件(inet_ntoa(peer.sin_addr));
关闭(connectlist[listnum]);
connectlist[listnum]=0;
}
当连接关闭时,我可以获取客户端的ip,但当连接重置时,我无法获取客户端的ip。我在连接重置时得到0.0.0.0。我怎样才能解决这个问题。谢谢,您可能希望使用调用
accept()
返回的struct sockaddr
,该调用是在read()之前完成的
man accept
的逐字记录:
int-accept(int-sockfd,struct-sockaddr*addr,socklen\u t*addrlen)强>
[……]
参数addr是指向sockaddr结构的指针。这
结构中填充了对等套接字的地址,即
到通信层。返回的地址的确切格式
地址由
套接字的地址系列(请参阅套接字(2)和相应的协议手册页)。当addr为空时,不填写任何内容;在这个
不使用addrlen,也应为NULL
您可能希望使用调用accept()
返回的struct sockaddr
,该调用是在read()
ing之前完成的
man accept
的逐字记录:
int-accept(int-sockfd,struct-sockaddr*addr,socklen\u t*addrlen)强>
[……]
参数addr是指向sockaddr结构的指针。这
结构中填充了对等套接字的地址,即
到通信层。返回的地址的确切格式
地址由
套接字的地址系列(请参阅套接字(2)和相应的协议手册页)。当addr为空时,不填写任何内容;在这个
不使用addrlen,也应为NULL
getpeername()
仅适用于连接的套接字。一旦套接字断开连接,调用它时将出现ENOTCONN
错误。这就是为什么getpeername()
有时用作检查套接字是否已连接。getpeername()
仅适用于已连接的套接字。一旦套接字断开连接,调用它时将出现ENOTCONN
错误。这就是为什么getpeername()
有时被用作检查套接字是否已连接。之前完成的accept()
将为您提供客户端地址和端口。因此,在accept上使用struct sockaddr将为我提供客户端的ip地址?。。谢谢。你需要检查errno
,然后再盲目地假设你得到了重置。可能还有其他一些事情。为什么要关闭套接字两次?之前完成的accept()
将为您提供客户端地址和端口。因此,在accept上使用struct sockaddr将为我提供客户端的ip地址?。。谢谢。你需要检查errno
,然后再盲目地假设你得到了重置。可能还有其他一些事情。你为什么要关两次插座?但有什么区别?我在连接关闭时获得ip,但在连接重置时未获得ip?如果连接已重置,则对等信息已消失@黛米:有什么区别?我在连接关闭时获得ip,但在连接重置时未获得ip?如果连接已重置,则对等信息已消失@除雾器