我试图获取连接到我的服务器的每个客户端的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'的全部大小中。 –