Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检索已重置连接的客户端的ip地址_C_Linux_Sockets - Fatal编程技术网

C 检索已重置连接的客户端的ip地址

C 检索已重置连接的客户端的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

我有一段代码,当客户端关闭或失去连接时,它会获取客户端的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(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?如果连接已重置,则对等信息已消失@除雾器