免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2608 | 回复: 8
打印 上一主题 下一主题

紧急求助linux下网络编程高手 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-07 23:19 |只看该作者 |倒序浏览
最近负责一个设备网络模块程序的开发,采用TCP连接.设备是在linux下运行client程序, server 端是在windows下运行;设备网络模块采用多线程模式:一个线程负责简历和维护网络连接 , 因为可能网络状况不是很好,有可能会断线; 一个线程负责接受server端发过来的命令(使用recv()函数)并负责解析命令,然后调用相应的模块 ; 另外一个线程对数据做相应的处理后发送数据给server (使用send()函数) ;
在做测试的时候,跟server 连接后 , 只要server端程序一关闭 ,不管是正常关闭还是异常退出, 我设备client程序的接受线程的recv()函数首先返回0后 , 整个client进程就会马上挂掉 . 信息显示是被内核KILL掉的. 我的client程序已经对SIGPIPE信号进行捕捉并做了处理 ,但是根据出错时打印的信息显示根本没有进入这个信号处理函数 , 这几天一直搞不明白我的程序为什么会挂掉?请高手指点一二,谢谢~!

另外一种现象是在网上下载一个在windows平台下的TCP&UDP工具, 在此工具上建立一个TCP服务器 ,我设备的client程序与之连接 ,双方正在发送数据, 我突然关闭此工具程序 , 但是我设备的client程序仍然可以完好继续运行,我反复测试了很多次, 一点问题都没有的 .这又是为什么呢?
请指教,谢谢~!

论坛徽章:
0
2 [报告]
发表于 2008-01-08 09:20 |只看该作者
很可能是线程之间的同步阿什么没做好,比如在recv返回0后free了某块内存,但在其他线程中还在继续使用,但如果是这样的话,似乎无法解释第二种现象,多打印点信息出来找毛病比较容易些。

论坛徽章:
0
3 [报告]
发表于 2008-01-08 09:24 |只看该作者
  printf大法!

论坛徽章:
0
4 [报告]
发表于 2008-01-08 09:35 |只看该作者
makefile 里,-g 打开
core信息打开,看是否产生core文件,如果有的话,看core文件的信息
如果是kill的话,应该有sig的,如果没有的话,估计是core了。你先看看core在哪里再从那里去找问题

论坛徽章:
0
5 [报告]
发表于 2008-01-08 10:42 |只看该作者
第一个问题怀疑你写的程序本身可能有问题,连接关闭后可能有一些非法操作,导致还没有进入SIGPIPE就退出了。查查是否还收到了其它信号。
第二个问题可能是TIME_WAIT状态导致的,不过你没有叙述清楚,只是猜测。

论坛徽章:
0
6 [报告]
发表于 2008-01-08 14:00 |只看该作者
今天上午仔细测试了一下,我把RECV()函数的返回值打印出来,结果发现:跟TCP&UDP工具相连时,关闭此服务端程序,RECV()函数返回的是0,用perror()函数打印的错误是:“secuss !”,我的client程序正常往下执行;但是跟我同事的SERVER相连时,他关闭SERVER端,我的RECV()函数返回的是-1而不是0,用perror()函数打印的错误是:“connected reset by peer”,我觉得这个RESET不应该是在他的SERVER端套接字关闭之后我的CLIENT端往对方发送数据引起的,因为我在测试之前关闭了SEND()函数,也就是说测试的时候程序根本没有调用这个SEND()函数,那么这个“connected reset by peer”是什么原因产生的呢?搞清楚了这个原因,应该就可以解决这个问题了。
使用TCP&UDP工具相连时,不管有没有调用SEND()函数,都不会有这个复位的错误。

[ 本帖最后由 mouse2000 于 2008-1-8 14:04 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-01-08 14:18 |只看该作者
那就是你自己的程序写得不健壮。发送RST有多种原因,最可能是对方的接收缓冲区中还有数据没有读出来就close那个socket了(windows下不知道这种情况会不会发送RST,linux下会),还有就是对方设置了那个linger。我们在写socket程序的时候,要能够处理所有异常情况,不要以为对方会按我们的期望发送数据过来,也不要以为对方会按tcp ip协议的规范发送数据过来,一切外来数据都需要小心检查

论坛徽章:
0
8 [报告]
发表于 2008-01-08 14:22 |只看该作者
也不要以为对方会按tcp ip协议的规范发送数据过来

这个太过分了

论坛徽章:
0
9 [报告]
发表于 2008-01-08 14:25 |只看该作者
呵呵,是有些过份,这些都是协议栈考虑过了的问题,应用程序应该不用考虑了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP