我試圖獲取連接到我的服務器的每個客戶端的IP地址。我將其保存到我發送給線程的結構的字段中。我注意到,有時我得到正確的IP,有時候是錯誤的。我的第一個通常連接同行中有一個不正確的IP ...從服務器獲取客戶端的IP地址
0
A
回答
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
http://linux.die.net/man/3/inet_ntoa從:
的INET_NTOA()函數將在Internet上的主機地址,在網絡字節順序給出 ,在IPv4中的字符串點分十進制表示法。 該字符串在靜態分配的緩衝區中返回,後續調用將被覆蓋。
強調添加。
+0
換句話說,你需要使數據的副本'INET_NTOA()'的回報,你不能保存返回的指針,是。 –
相關問題
- 1. 從服務器獲取客戶端的IP地址
- 2. 獲取NIO.2服務器中客戶端IP地址列表
- 3. CSocket服務器獲取客戶端IP地址
- 4. 從Windows Azure服務獲取客戶端IP地址
- 5. 從服務器端獲取已知MAC地址的IP地址
- 6. 獲取SOAP服務客戶端的IP地址
- 7. 如何從服務器獲取我的Corba客戶端的IP地址
- 8. 客戶端請求服務器使用服務器IP地址
- 9. 改進我從客戶端獲取服務器IP地址的方式
- 10. 始終從Servlet獲取客戶端IP地址:: 1的地址
- 11. 如何獲取客戶端IP地址
- 12. 如何獲取客戶端IP地址
- 13. 如何在Struts2/Servlet中從Apache Web服務器獲取客戶端IP地址?
- 14. 如何獲取客戶端的本地IP地址和代理服務器
- 15. 開箱_WTS_CLIENT_ADDRESS.Address在vb.net(從終端服務客戶端獲取IP地址)
- 16. Web服務器來獲取客戶端的機器mac地址
- 17. 如何從客戶端機器獲取IP地址?
- 18. 客戶端(android) - 服務器(java)通信 - 本地ip地址
- 19. 如何獲取身份服務器中客戶端的遠程IP地址4
- 20. 在服務器端獲取本地IP地址的非服務器端方法?
- 21. 確定服務器上連接的客戶端的IP地址
- 22. 獲取Web服務客戶端IP
- 23. 如何確定客戶端連接的服務器IP地址
- 24. 客戶端如何發現服務器的IP地址?
- 25. 服務器如何存儲客戶端的IP地址?
- 26. 服務器如何找到真實的客戶端IP地址?
- 27. 設置可以檢測客戶端IP地址的服務器
- 28. 檢測客戶端和服務器的IP地址
- 29. 如何使用Java在GWAN服務器中獲取客戶端IP地址?
- 30. 如何獲取系統的客戶端ip和服務器ip?
應該將內存分配給p-> ip? – coder4lyf
它已經是。在我的例子中,'ip'是一個固定長度的數組。調用'malloc()'時,它包含在'peerInfo'的全部大小中。 –