0

我有这段代码,当客户端关闭或失去连接时,它会获取客户端的 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;
}

连接关闭时我可以获取客户端的 ip,但连接重置时我没有获取客户端的 ip。我在连接重置时得到 0.0.0.0。我怎样才能解决这个问题。谢谢,

4

2 回答 2

2

getpeername()仅适用于连接的套接字。ENOTCONN一旦套接字断开连接,调用它时就会出错。这就是为什么getpeername()有时用作检查套接字是否已连接的原因。

于 2012-11-07T17:06:47.993 回答
1

您可能希望在 ing之前使用 donestruct sockaddr调用返回的。accept()read()

逐字逐句man accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

[...]

参数 addr 是指向 sockaddr 结构的指针。 如通信层所知,该结构用对等套接字的地址填充。 返回地址 addr 的确切格式由套接字的地址族确定(参见 socket(2) 和相应的协议手册页)。addr为NULL时,不填任何内容;在这种情况下,不使用 addrlen,也应该为 NULL。

于 2012-11-07T16:59:33.590 回答