搜索
bottom↓
回复: 12

请教大家一个linux socket编程的问题

[复制链接]

出4535入62汤圆

发表于 2020-1-6 16:43:19 | 显示全部楼层 |阅读模式
本帖最后由 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,然后重启运行,就可以了(以上路由器重启过程中,该设备的进程是一直跑的)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2020-1-6 16:54:53 | 显示全部楼层
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?

出4535入62汤圆

 楼主| 发表于 2020-1-6 16:55:31 | 显示全部楼层
icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?

运行程序的设备IP变了

出4535入62汤圆

 楼主| 发表于 2020-1-6 16:55:55 | 显示全部楼层
本帖最后由 supercoo 于 2020-1-6 16:57 编辑
icexiong 发表于 2020-1-6 16:54
你连接的设备IP更改了,还是你这个运行程序设备的IP更改了?


使用的udp协议

出0入0汤圆

发表于 2020-1-6 16:57:22 | 显示全部楼层
要么用静态IP,要么设备用DHCP重新向路由器申请新的IP

出4535入62汤圆

 楼主| 发表于 2020-1-6 16:58:21 | 显示全部楼层
广轻电气091 发表于 2020-1-6 16:57
要么用静态IP,要么设备用DHCP重新向路由器申请新的IP


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

出0入0汤圆

发表于 2020-1-6 16:59:16 | 显示全部楼层
你把你的设备固定个IP地址能行吗,不用自动获取

出4535入62汤圆

 楼主| 发表于 2020-1-6 17:02:30 | 显示全部楼层
icexiong 发表于 2020-1-6 16:59
你把你的设备固定个IP地址能行吗,不用自动获取

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

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

出0入0汤圆

发表于 2020-1-6 17:15:19 | 显示全部楼层
Socket在connect时就隐式bind过了,IP变了当然没法用。如果IP变了,closesocket()然后重新socket()、connect()就可以了。

出4535入62汤圆

 楼主| 发表于 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掉进程-启动进程,也可以恢复

就是不知道其中的原理

出0入0汤圆

发表于 2020-1-6 17:30:08 | 显示全部楼层
supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的

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

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

出0入0汤圆

发表于 2020-1-6 16:43:20 | 显示全部楼层
supercoo 发表于 2020-1-6 17:21
是该设备的内网IP变了,接收端服务器的外网固定IP一直是没变的

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

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

出0入8汤圆

发表于 2020-1-6 21:16:38 来自手机 | 显示全部楼层
我记得要用select去判断,超时则关闭链接并重新connect
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 09:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表