supercoo 发表于 2020-1-6 16:43:19

请教大家一个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,然后重启运行,就可以了(以上路由器重启过程中,该设备的进程是一直跑的)

icexiong 发表于 2020-1-6 16:54:53

你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?

supercoo 发表于 2020-1-6 16:55:31

icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?

运行程序的设备IP变了

supercoo 发表于 2020-1-6 16:55:55

本帖最后由 supercoo 于 2020-1-6 16:57 编辑

icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?

使用的udp协议

广轻电气091 发表于 2020-1-6 16:57:22

要么用静态IP,要么设备用DHCP重新向路由器申请新的IP

supercoo 发表于 2020-1-6 16:58:21

广轻电气091 发表于 2020-1-6 16:57
要么用静态IP,要么设备用DHCP重新向路由器申请新的IP

是使用的DHCP,已经重新获取了IP网络也是正常的,但是进程中调用send,发不出信息

icexiong 发表于 2020-1-6 16:59:16

你把你的设备固定个IP地址能行吗,不用自动获取

supercoo 发表于 2020-1-6 17:02:30

icexiong 发表于 2020-1-6 16:59
你把你的设备固定个IP地址能行吗,不用自动获取

应该可以的,因为测过,重启路由器以后,改设备的IP如果没有改变,发送数据就是正常的

但是现在不清楚为什么,IP变了,网络还是连接正常的,却send发不出数据

Scarlette 发表于 2020-1-6 17:15:19

Socket在connect时就隐式bind过了,IP变了当然没法用。如果IP变了,closesocket()然后重新socket()、connect()就可以了。

supercoo 发表于 2020-1-6 17:21:28

Scarlette 发表于 2020-1-6 17:15
Socket在connect时就隐式bind过了,IP变了当然没法用。如果IP变了,closesocket()然后重新socket()、connec ...

是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的

这样也需要重新socket、connect吗?

这个方法,我一会试一下,我觉得应该是可以解决此问题的,因为重新kill掉进程-启动进程,也可以恢复

就是不知道其中的原理

jenkins 发表于 2020-1-6 17:30:08

supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的

这样也需要重新socket、connect吗?


有可能是在DHCP获取到新的IP地址之前你已经把Socket connect了

Scarlette 发表于 2020-1-6 16:43:20

supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的

这样也需要重新socket、connect吗?


我说的就是本地。bind是为Socket绑定本地地址和端口,IP一变该socket句柄就没用了。

liwei_jlu 发表于 2020-1-6 21:16:38

我记得要用select去判断,超时则关闭链接并重新connect
页: [1]
查看完整版本: 请教大家一个linux socket编程的问题