找回密码
 立即注册
img_loading
智能检测中

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 1389|回复: 0

linux tcp socket 程序直接退出问题

[复制链接]
发表于 2016-9-21 11:28 | 显示全部楼层 |阅读模式
本帖最后由 zeng362424 于 2016-9-21 14:37 编辑

1.最近帮朋友做openwrt上网速测试的功能,遇到测试上传网速(tcp send)的时候,程序直接退出了,没有任何提示。
后面strace 追踪到是因为程序收到SIGPIPE信号,直接退出了。
一开始想到的是信号屏蔽,当程序收到SIGPIPE信号的时候做处理。
后面发现linux send函数可以直接忽视掉信号。因为这个程序不需要在收到SIGPIPE信号的时候特殊处理,
所以就直接选择在send函数的时候直接忽视掉信号(把send函数最后一个参数置为MSG_NOSIGNAL)。
send(pSockId, pOut, pOutSize, MSG_NOSIGNAL)


2、recv获取信息的时候有时候会卡死,这个是因为recv默认是阻塞的,为了防止程序一直阻塞在这里,
需要增加超时机制,超时主要有两种实现,一种是select,一种是setsockopt。两种实现方式和区别,
网上有很多解释,这里不做说明。
这里我选择setsockopt来实现。
  1. #include <time.h>
  2. #include <sys/time.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>

  5. struct timeval timeout  = {5,0};
  6. setsockopt(sockId,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
复制代码

3.设置connecte超时
  1. setsockopt(sockId,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
复制代码





只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛

只谈技术、莫论政事!切勿转播谣言!为了你也为了他人。
只谈技术、莫论政事!(点击见详情) 切记不要随意传播谣言,把自己的日子过安稳了就行,为了自己好也为了大家好。 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。

查看 »

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2025-6-16 06:45

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

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