我试图获取连接到我的服务器的每个客户端的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. CSocket服务器获取客户端IP地址
- 2. 获取SOAP服务客户端的IP地址
- 3. 如何从服务器获取我的Corba客户端的IP地址
- 4. 如何获取客户端IP地址
- 5. 如何获取客户端IP地址
- 6. 开箱_WTS_CLIENT_ADDRESS.Address在vb.net(从终端服务客户端获取IP地址)
- 7. Web服务器来获取客户端的机器mac地址
- 8. 如何获取身份服务器中客户端的远程IP地址4
- 9. 在服务器端获取本地IP地址的非服务器端方法?
- 10. 确定服务器上连接的客户端的IP地址
- 11. 获取Web服务客户端IP
- 12. 客户端如何发现服务器的IP地址?
- 13. 设置可以检测客户端IP地址的服务器
- 14. 服务器如何找到真实的客户端IP地址?
- 15. 检测客户端和服务器的IP地址
- 16. PHP |从客户端用户获取私有IP地址?
- 17. 如何通过xinetd从java服务器获取客户端IP?
- 18. 从服务器JSP获取客户端IP [安全]
- 19. Spring从RPC编码的Webservice客户端获取IP地址
- 20. 如何使用Rails获取客户端IP和服务器IP
- 21. Azure客户端IP地址
- 22. 客户端ip地址
- 23. 在服务器端,获取客户端连接的服务器IP
- 24. 获取服务器IP地址
- 25. 获取IP地址当前服务器
- 26. 如何获取服务器IP地址?
- 27. 如何在Grails控制器中获取客户端IP地址?
- 28. 获取客户端IP地址UC浏览器和Opera Mini
- 29. 在Worklight适配器上获取客户端IP地址
- 30. Ruby - 从gem中获取客户端IP地址
应该将内存分配给p-> ip? – coder4lyf
它已经是。在我的例子中,'ip'是一个固定长度的数组。调用'malloc()'时,它包含在'peerInfo'的全部大小中。 –