从服务器获取客户端的IP地址

时间:2015-10-16 21:05:36

标签: sockets struct ip-address

我试图获取连接到我的服务器的每个客户端的IP地址。我将其保存到我发送到线程的结构的字段中。我注意到有时候我会得到正确的ip,有时候会得到错误的ip。我的第一个连接对象通常有一个不正确的IP ...

2 个答案:

答案 0 :(得分:0)

来自http://linux.die.net/man/3/inet_ntoa

  

inet_ntoa()函数转换给定的Internet主机地址   以网络字节顺序,以IPv4点分十进制表示法的字符串。   字符串在静态分配的缓冲区中返回,该缓冲区   后续调用将覆盖。

强调补充。

答案 1 :(得分:0)

问题是inet_ntoa()返回一个指向静态内存的指针,每次调用inet_ntoa()时都会被覆盖。在再次调用inet_ntoa()之前,您需要复制数据:

struct peerInfo{
    char ip[16];
    int socket;
};  

while((newsockfd = accept(sockfd,(struct sockaddr *)&clt_addr, &addrlen)) > 0)
{
    struct peerInfo *p = (struct peerInfo *) malloc(sizeof(struct peerInfo));

    strncpy(p->ip, inet_ntoa(clt_addr.sin_addr), 16);
    p->socket = newsockfd;

    printf("A peer connection was accepted from %s:%hu\n", p->ip, ntohs(clt_addr.sin_port));

    if (pthread_create(&thread_id , NULL, peer_handler, (void*)p) < 0)
    {
        syserr("could not create thread\n");
        free(p);
        return 1;
    }

    printf("Thread created for the peer.\n");
    pthread_detach(thread_id);
}

if (newsockfd < 0)
{
    syserr("Accept failed.\n");
}