c++http问题_DCHP服务器与无线掉线:一次问题的发现

问题描述:

手机聊微信、电脑看新闻联播(没夸张,真的在看央视影音央视一套人与自然栏目第20200313期天坑探秘节目)正High着,突然就没网络了。。

掉线了?而且是手机和电脑同时掉线。

进路由器后台,打不开,因为掉线。

Wifi掉线很好解决,重新连接就完事了(毕竟重启解决90%的问题,重装解决99%的问题)

但是问题是啥?

问题定位:

重新连接后打开路由器后台,看日志:

240 8days, 02:51:27, DHCPS: Send OFFER with ip 192.168.0.102 241 8days, 03:42:39, DHCPS:Server id not found and request an invalid ip
242 8days, 03:42:39, DHCPS: Send NAK 243 8days, 03:42:41, DHCPS:Server id not found and request an invalid ip
244 8days, 03:42:41, DHCPS: Send NAK

第241和243段日志标出了问题。

百度DCHP,看协议的具体协商应答过程:

edeb8a3775a486720f52699099502fcc.png
资料来源:百度百科

因为我家多个路由器,移动光猫自身路由器A+路由器B+路由器C,其中光猫路由器A和B构成一级局域网,一级局域网只有光猫DCHP服务器。AB网络下面还有一个C,两个嵌套构成了一个二级局域网络(AB+C),二级局域网由路由器C的DCHP服务器负责分配IP:

7e0e0e89c777bcc2975e84af26473dd2.png
家里网络的拓扑结构

其中AB的DCHP服务器ip地址设置为http://192.168.1.XXX,C网络的DCHP地址段为192.168.0.1XX(即IP是不会重合的)。

我的手机和电脑主要在C路由器下面即二级局域网中活动。上述错误日志也是在C路由器中看的。看起来问题在于电脑和手机同时请求了一个错误的IP地址,DCHP服务器的id也是错的。

问题推断:

综合网络环境来推断:

手机和电脑不知道咋回事对AB网络进行了ip请求,但是发送到了C网络,与C网络里面的DCHP服务器的id不一致,请求的IP地址也是无效的(因为C的DCHP的ip段在http://192.168.0.XXX段,与AB的http://192.168.1.XXX段不同),因此C路由器的DCHP只能发送拒绝:

242 8days, 03:42:39, DHCPS: Send NAK

但是PC和手机接下去就不知所措了,被拒绝以后没有及时自动发起重新请求,因此导致断网。

重新打开wifi开关以后,人工重新开启请求,就可以正常连接了。

问题解决:

问题在于电脑和手机为啥发起了错误的请求。可能是接收到了AB网络的DCHP应答并进行了申请,因此这里关闭了A的wifi功能,尽可能减少网络重叠。

根本原因还是要减少网络复杂度,撤掉二级局域网,融合成一个网络,只保留一个DCHP服务器,IP静态保留与终端mac地址绑定等等。

要睡觉了,明天再折腾。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Fortran中调用C++函数需要使用Fortran/C混合编程的方式。具体步骤如下: 1. 在C++中定义函数bool my_cpp_read(const std::string &fullName),并使用extern "C"修饰符将其声明为C函数。例如: ``` extern "C" bool my_cpp_read(const std::string &fullName) { // C++函数的实现 // ... } ``` 2. 在Fortran程序中使用bind(C)修饰符声明Fortran接口函数,并使用ISO_C_BINDING模块中的C_CHAR类型表示C++中的const char*类型。同时,使用LOGICAL(KIND=C_BOOL)类型表示C++中的bool类型。例如: ``` USE ISO_C_BINDING INTERFACE FUNCTION my_cpp_read(fullName) BIND(C, NAME='my_cpp_read') USE, INTRINSIC :: ISO_C_BINDING IMPLICIT NONE CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: fullName LOGICAL(KIND=C_BOOL) :: my_cpp_read END FUNCTION my_cpp_read END INTERFACE ``` 3. 在Fortran程序中调用C++函数my_cpp_read。在调用时,需要将Fortran中的字符串转换为C++中的std::string类型,并将C++中的bool类型转换为Fortran中的LOGICAL(KIND=C_BOOL)类型。例如: ``` PROGRAM main USE ISO_C_BINDING IMPLICIT NONE CHARACTER(KIND=C_CHAR), PARAMETER :: file_name_c = "test.txt" CHARACTER(LEN=LEN(file_name_c)) :: file_name LOGICAL(KIND=C_BOOL) :: read_success file_name = TRANSFER(file_name_c, file_name) read_success = my_cpp_read(file_name) IF (read_success) THEN PRINT *, "Read file successfully" ELSE PRINT *, "Failed to read file" END IF END PROGRAM main ``` 以上是Fortran调用C++函数的一般步骤,具体实现可能需要根据实际情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值