请教大家一个linux socket编程的问题
本帖最后由 supercoo 于 2020-1-6 17:03 编辑目前设置如下,工作都是正常的
sock_up = socket(q->ai_family, q->ai_socktype,q->ai_protocol);
connect(sock_up, q->ai_addr, q->ai_addrlen);
send(sock_up, (void *)buff_up, buff_index, 0);
但是,当该设备所连的路由器重启以后,设备的IP发生改变,就发送数据不成功了(如果路由器重启IP不改变,则重新连上网络以后可以恢复正常)
请教这个什么原因?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
抱歉没有描述清楚
1、该设备给有固定外网IP的服务器发信息,使用udp协议
2、该设备使用dhcp,路由器重启以后,该设备可以重新获取新的IP,并且连接网络是正常的
3、但是程序中send,此时发送失败,必须把该进程重新kill,然后重启运行,就可以了(以上路由器重启过程中,该设备的进程是一直跑的)
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了? icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?
运行程序的设备IP变了 本帖最后由 supercoo 于 2020-1-6 16:57 编辑
icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?
使用的udp协议 要么用静态IP,要么设备用DHCP重新向路由器申请新的IP 广轻电气091 发表于 2020-1-6 16:57
要么用静态IP,要么设备用DHCP重新向路由器申请新的IP
是使用的DHCP,已经重新获取了IP网络也是正常的,但是进程中调用send,发不出信息 你把你的设备固定个IP地址能行吗,不用自动获取 icexiong 发表于 2020-1-6 16:59
你把你的设备固定个IP地址能行吗,不用自动获取
应该可以的,因为测过,重启路由器以后,改设备的IP如果没有改变,发送数据就是正常的
但是现在不清楚为什么,IP变了,网络还是连接正常的,却send发不出数据 Socket在connect时就隐式bind过了,IP变了当然没法用。如果IP变了,closesocket()然后重新socket()、connect()就可以了。 Scarlette 发表于 2020-1-6 17:15
Socket在connect时就隐式bind过了,IP变了当然没法用。如果IP变了,closesocket()然后重新socket()、connec ...
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的
这样也需要重新socket、connect吗?
这个方法,我一会试一下,我觉得应该是可以解决此问题的,因为重新kill掉进程-启动进程,也可以恢复
就是不知道其中的原理 supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的
这样也需要重新socket、connect吗?
有可能是在DHCP获取到新的IP地址之前你已经把Socket connect了 supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的
这样也需要重新socket、connect吗?
我说的就是本地。bind是为Socket绑定本地地址和端口,IP一变该socket句柄就没用了。 我记得要用select去判断,超时则关闭链接并重新connect
页:
[1]