2015-10-16 201 views
0

我試圖獲取連接到我的服務器的每個客戶端的IP地址。我將其保存到我發送給線程的結構的字段中。我注意到,有時我得到正確的IP,有時候是錯誤的。我的第一個通常連接同行中有一個不正確的IP ...從服務器獲取客戶端的IP地址

回答

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"); 
} 
+0

應該將內存分配給p-> ip? – coder4lyf

+0

它已經是。在我的例子中,'ip'是一個固定長度的數組。調用'malloc()'時,它包含在'peerInfo'的全部大小中。 –

0

http://linux.die.net/man/3/inet_ntoa從:

的INET_NTOA()函數將在Internet上的主機地址,在網絡字節順序給出 ,在IPv4中的字符串點分十進制表示法。 該字符串在靜態分配的緩衝區中返回,後續調用將被覆蓋。

強調添加。

+0

換句話說,你需要使數據的副本'INET_NTOA()'的回報,你不能保存返回的指針,是。 –

相關問題