关于网络程序中的问题
这两天发现了一个linux下的网络问题,不知道是我程序的原因还是系统的原因,感觉很头痛,请大家帮帮忙。问题是这样的
我用tcp连接和远端的服务器进行通信,首先建立连接,然后发送数据,接着断开连接,重复执行这个过程,如果重复过程很快的话,不多长时间网络就不通了,必须用ifdown和ifup重新启动网卡才可以,如果简单的用ifconfig eth0 down和ifconfig eth0 up ,重新启动程序后还是报告网络无法连通。
请问这是系统的问题吗,还是编程程序的时候需要注意些什么?
问题点数:20、回复次数:21Top
1 楼fierygnu(va_list)回复于 2006-03-03 12:50:12 得分 0
是不是bind同样的地址和端口?netstat看不通时连接是否进入TIME_WAIT状态?Top
2 楼wil(wil)回复于 2006-03-03 13:19:26 得分 0
我没有使用bind函数,而是创建socket后直接调用connect函数。connect函数返回,报告network unreachable错误Top
3 楼fierygnu(va_list)回复于 2006-03-03 13:41:02 得分 0
比较出现问题前的ifconfig和route的输出。Top
4 楼tonyMCM(南京~上海)回复于 2006-03-03 14:16:50 得分 0
mark 学习一下Top
5 楼alaiyeshi(七宝树八宝饭)回复于 2006-03-03 14:32:39 得分 0
是不是SO_REUSEADDR的问题?Top
6 楼fierygnu(va_list)回复于 2006-03-03 14:37:52 得分 0
network unreachable应该是路由的问题。
我上面写的漏了一个字:比较出现问题前后的ifconfig和route的输出。Top
7 楼wil(wil)回复于 2006-03-03 15:20:29 得分 0
比较了前后现象,发现路由表中默认网关项消失了。Top
8 楼fierygnu(va_list)回复于 2006-03-03 15:29:31 得分 0
路由表中默认网关项消失了?奇怪,你的应用是干什么的?Top
9 楼wil(wil)回复于 2006-03-03 15:39:47 得分 0
我的程序很简单阿,我用tcp连接和远端的服务器进行通信,首先建立连接,然后发送数据,接着断开连接,很快重复执行这个过程。这是另外一个程序的简化,可是这个简化的程序仍然存在这个问题
Top
10 楼fierygnu(va_list)回复于 2006-03-03 15:50:13 得分 0
使用DHCP吗?或者使用动态路由协议?Top
11 楼wil(wil)回复于 2006-03-03 15:57:36 得分 0
没有使用DHCP方式。而且在程序重复执行时(这时网关已经消失了),使用路由命令增加默认网关没法增加。Top
12 楼fierygnu(va_list)回复于 2006-03-03 16:00:55 得分 0
用strace跟踪route add,看看什么地方有问题了。Top
13 楼wil(wil)回复于 2006-03-03 16:43:50 得分 0
我比较了关闭程序前后strace route add的输出,发现只有几个常数不同,因此我怀疑即使在程序运行的时候也可以使用route add添加路由表项,只不过当时程序在运行(调用connet),一调用connect,路由表项中的默认网关又消失了。Top
14 楼fierygnu(va_list)回复于 2006-03-03 16:59:01 得分 0
发现只有几个常数不同
===详细点?Top
15 楼wil(wil)回复于 2006-03-03 17:12:02 得分 0
1、execve返回值不同
execve("/sbin/route", ["route", "add", "default", "gw", "192.168.0.1"], [/* 35 vars */]) = 0 uname({sys="Linux", node="lihuanzhong", ...}) = 0 brk(0) = 0x8196000
execve("/sbin/route", ["route", "add", "default", "gw", "192.168.0.1"], [/* 35 vars */]) = 0 uname({sys="Linux", node="lihuanzhong", ...}) = 0 brk(0)= 0x9aad000
2、
brk(0) = 0x8196000 brk(0x81b7000) = 0x81b7000
brk(0) = 0x9aad000 brk(0x9ace000) = 0x9ace000
每个不同之处的前一个是程序运行时调用route add,后一个是结束程序后调用route addTop
16 楼fierygnu(va_list)回复于 2006-03-03 17:16:51 得分 0
这个不是问题。第二次执行哪里出错了?Top
17 楼wil(wil)回复于 2006-03-03 17:26:36 得分 0
没有出错的地方,所以我认为即使在程序运行的时候添加路由表项也成功了,不过由于程序在运行,所以添加的路由表项又消失了。我跟踪了程序,发生问题的时候调用connect超时,接着调用connect则显示network unreachable.
奇怪的是如果在程序中只是建立连接、关闭连接,而不发送数据则不会出现这个问题。Top
18 楼fierygnu(va_list)回复于 2006-03-03 17:32:19 得分 0
在程序重复执行时(这时网关已经消失了),使用路由命令增加默认网关没法增加
===
手工增加还是程序增加?如果是手工增加,报什么错误吗?Top
19 楼wil(wil)回复于 2006-03-03 17:37:59 得分 0
我是手工增加的,没有报任何错误,可是接着用route看,看不到默认网关路优选项。Top
20 楼wil(wil)回复于 2006-03-03 17:42:24 得分 0
现在我改变了一下程序,当我在程序中检测到network unreachable,我使用system调用增加默认网关路优选项,程序可以接着运行一会。Top
21 楼fierygnu(va_list)回复于 2006-03-03 23:13:07 得分 0
从描述看,就是路由的问题。ifup会自动设置缺省路由,所以ifconfig不行但ifup可以。
描述一下你的机器的组网、设置,是否启用动态路由协议。ifconfig和route的输出贴一下吧。
内核版本是多少?简化的程序方便贴上来吗?
Top




