CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

关于网络程序中的问题

楼主wil(wil)2006-03-03 11:41:22 在 Linux/Unix社区 / 程序开发区 提问

这两天发现了一个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

相关问题

  • 程序中的程序
  • 中断程序
  • vb中如何用程序强行断开网络驱动器?
  • 如何在VB中调用拨号网络程序?
  • 做winsock的程序一定要在网络中吗?
  • 在pb程序当中如何测试网络连接?
  • 网络公司招java中级程序员
  • 网络公司招java中级程序员
  • 怎么样在程序中选择网络连接!
  • WINSOCK程序网络通信

关键词

  • 网关
  • 连接
  • 函数
  • 执行
  • 数据
  • 网络
  • 程序
  • 调用
  • 表项
  • 默认网关

得分解答快速导航

  • 帖主:wil

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo