|
本帖最后由 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来实现。- #include <time.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- struct timeval timeout = {5,0};
- setsockopt(sockId,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
复制代码
3.设置connecte超时- setsockopt(sockId,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
复制代码
|
|