程序员

记录一下获取的动态ip与路由器ip不符所以要纠错的日常

作者:admin 2021-06-08 我要评论

昨天集群动态Ip显示出错了与路由器上的ip不符说来也巧刚好五个Ip对了三个错了两个。事情的来龙去脉是这样的下午1419分实验室突然停电了过了三分钟以后来电了动态...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

昨天集群动态Ip显示出错了,与路由器上的ip不符,说来也巧,刚好五个Ip,对了三个错了两个。事情的来龙去脉是这样的:下午14:19分实验室突然停电了,过了三分钟以后来电了,动态ip发生了变化,于是我连接了ip1和ip4,还是可以正常使用,但是又过了五分钟,我两个设备同时显示“VPN failed to start”,但是我切换成ip2和ip5还是可以正常使用。

本来以为相安无事,结果师兄告诉我是动态Ip获取错误了,错的两个刚好是ip1和ip4…马萨卡!
于是就要找出代码哪里出错了…考虑到我太菜了师兄安排了大佬指导我qvq
在这里插入图片描述
记录我们的一些尝试和挣扎:

1 寻找动态Ip的代码写在哪里了

因为师兄只告诉我们去解决问题qvq并没说相关代码在哪里。于是我们从节点机上开始找,并没有搜到“动态ip”四个字,说明节点机不包含这部分代码。于是我们用权限进入管理机,进入以后直接ls,我看到有一个叫做“Codes”的文件夹,但是看了看还是不对。大佬最后发现代码放在/opt/login-station目录。
.

2 把代码从管理机scp到我的虚拟机上便于调试

我最后是直接在管理机上运行scp代码的:
scp -r -P 22223 /opt/login-station/ root@192.168.xxx.xxx:/home/Desktop/login-station/
在scp进行传输时输入的密码是@后面的密码。
这里需要端口号的原因是因为虚拟机有端口映射,端口映射是跟虚拟机绑定的
但是从管理机到节点是不需要端口映射的,而虚拟机在节点的内部
如果要从管理机传到主机,就不用加端口号了,因为默认22号端口,传输对应的ip地址一般应该是10.1.0.××。想查看ip地址的话命令是:ifconfig -a

但是大佬建议不要把工程文件传到主机,本地机器是没有连到路由器,可能不太好检测,所以就在docker里调试比较好。于是最后我们把工程文件弄到我的51号虚拟机上进行调试。
.

3 ip_detector_server.py与ip_detector_client.py

ip_detector_server.py下定义了一个get_new_ip()的函数。get_new_ip()中又涉及到ip_detector_client.py。
ip_detector_client.py功能是创建了client,负责循环发送0-50的数据,get_new_ip()中负责接收这个信息,信息发送过程中走的是网络线路,那就会经过路由器,所以它能获得路由器的ip地址。因为有五个路由器而我们不能重复获得相同的Ip地址因为没有意义,于是就让客户端一直发信息直接我们读取到了全部的五个ip地址,这样我们就有了五个动态ip。

功能了解了以后,就要找出哪里有问题了。
.

4 复制工程文件到管理机的另一个目录下进行调试并解决bind问题

我们把/opt/login-station/工程文件复制到了/home/xxxx/test/login-station/文件中打算进行测试,相关代码路径需要由/opt/批量修改为/home/xxxx/test/,修改完以后运行:python3 ip_detector_server.py
发现执行到get_new_ip()的时候,卡在了bind这里:server.bind((‘0.0.0.0’, 9999)),于是又搜索相关解决方案,输入netstat -nap 进行分析,发现好像9999端口号已经有程序在使用了。
于是我们将9999改为9998,相应的ip_detector_client.py中的9999也要改为9998,再次运行,发现bind这一行可以运行通过了。
.

5 发现根本问题

解决bind问题以后,我们又遇到了新的问题:
再次python3 ip_detector_server.py以后我们发现程序一直在运行但是也没报错,也没更新新的ip,为了发现到底问题出在哪里,我们在代码里面加了几个print,看看到底运行到了哪里没有输出。

最后问题在这里:
get_new_ip()中有这样的代码:

上面在执行ip_detector_client.py,执行完了回到这一步。
while True:
    print("执行到这里啦!")
	data, client_addr = server.recvfrom(BUFSIZE)
	print("我在这里!")
	if iplist.get(client_addr[0]) is None:
		iplist[client_addr[0]] = 1
		if len(iplist) == 5:
			break

通过调试,我们发现问题在“data, client_addr = server.recvfrom(BUFSIZE)”这一步代码。这个代码执行了以后并没有向下执行了,所以导致ip没有更新。
.

6 发现问题后做的一些挣扎

因为在实际调用时ip_detector_client.py执行的是在s0节点机上的ip_detector_client.py函数,由于发现get_new_ip()中的“data, client_addr = server.recvfrom(BUFSIZE)”一直在执行且没出现报错信息,于是我们把“data, client_addr = server.recvfrom(BUFSIZE)”这行代码移到了ip_detector_client.py的最后面,并重新运行python3 ip_detector_server.py

这下出现了报错:bad file descriptor
一言难尽

大佬觉得是两端没有发生通信,但是这就很奇怪了,为什么通信不了呢,而且是可以ping通的。

后来我们又用网上找到的代码小修了一下重新模拟发送和接收:
代码链接在这里:https://segmentfault.com/a/1190000016606777
我们让客户端发送,服务端接收,但是测试时客户端一直在发送,服务端却接收不了。。所以根本问题就是通信没有进行。。。

为了解决这个问题,我们还试了重新启动s0机器,并且去实地检查了设备是否正常在运作,但是还是没找到问题出在哪里。。。到底什么导致无法通信呢。。。
.

7 后续

我们告诉师兄没有解决成功,期待未来能知道到底哪里出了问题。。如果知道了我会再更新的!
不过这次经历受益匪浅,感谢大佬科普我计算机网络的知识。

.
.
.
上文内容写于2021.4.10

;原文链接:https://blog.csdn.net/weixin_44316581/article/details/115567111

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 第 2 章 基本数据类型

    第 2 章 基本数据类型

  • LeetCode笔记:Weekly Contest 234 比

    LeetCode笔记:Weekly Contest 234 比

  • 2021-04-11

    2021-04-11

  • 字符串算法 |   AC自动机算法

    字符串算法 | AC自动机算法

腾讯云代理商
海外云服务器