服务器端获取客户端ip地址的问题

公司App在访问服务器端接口时,后台会获取客户端的ip地址,正式服务器和测试环境都没有问题,两个之前都是使用的阿里云服务器。

为了节约成本,把测试服务器给挪到了内网的一台本地服务器上,但是有些功能需要通过访问,比如微信支付的回调等,当把环境部署好以后,想使用外网就安装了一个

内网穿透工具网云穿,通过这个进行外网的回调,但是这时问题出现了获取的ip地址竟然是"221.234.22.31, 192.168.0.3",注意这个串是由两个ip组成的,中间使用逗号给隔开了,

造成这个问题的原因当然是这个内网穿透工具了。

但是真实的客户端ip地址时逗号前面那个,所以可用使用String的split方法进行拆分,然后取数组中的第一个元素。具体代码如下

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取客户端经过所有网络节点的IP,可以在服务器端使用getpeername函数获取客户端IP和端口号,然后通过traceroute命令获取客户端经过的所有网络节点的IP。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> void traceroute(char *ip_addr); int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <ip_address>\n", argv[0]); exit(1); } traceroute(argv[1]); return 0; } void traceroute(char *ip_addr) { int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockfd < 0) { perror("socket"); exit(1); } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; inet_pton(AF_INET, ip_addr, &addr.sin_addr); int ttl = 1; setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); while (1) { printf("%d ", ttl); struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof(tv)); char buf[1024]; memset(buf, 0, sizeof(buf)); struct sockaddr_in raddr; socklen_t rlen = sizeof(raddr); if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&raddr, &rlen) < 0) { printf("*\n"); } else { printf("%s\n", inet_ntoa(raddr.sin_addr)); } if (raddr.sin_addr.s_addr == addr.sin_addr.s_addr) { break; } ttl++; setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); } close(sockfd); } ``` 首先创建一个原始套接字,然后设置套接字选项IPPROTO_IPIP_TTL,初始TTL值为1。在while循环中,先打印当前TTL值,然后设置接收超时时间为1秒,调用recvfrom函数接收ICMP报文,如果超时,则打印星号;否则打印发来报文的IP地址。如果接收到的报文来自目标IP地址,则跳出循环。每次循环结束后,TTL值加1,重新设置套接字选项IPPROTO_IPIP_TTL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值