免费注册 查看新帖 |

Chinaunix

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

求助: alarm第二次不能起作用和UDP问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-19 13:11 |只看该作者 |倒序浏览
在REDHAT 9编程中遇到两个问题,已经被折磨了好几天了,希望有高手可以指点一二,谢谢先

问题一:
通过UDP连接发送报文的函数, 在对方机器不存在的情况下, 用SEND函数发送报文会返回ERRNO为29的错误,即连接拒绝,但有时候又成功, 所以无法根据这点来判断对方程序是否正常, 是什么原因? 大家有遇到类似的问题吗?


问题二:
有一个简单的函数, 接收已建立UDP连接的SOCKET上来的数据, 需要循环调用

如果超时没有收到数据,返回一个值, 调用处做了一些处理后循环调用该函数



我目前遇到的问题是, 如果接收不到数据,第一次超时的时候, 都可以判断出超时, 

但之后就再也无法触发超时事件


函数如下:

jmp_buf udp_jmp_env;

void handle_timeout()
{
        printf("\nTime Out.\n");

        alarm ( 0 );       
        signal ( SIGALRM , handle_timeout );       
        longjmp ( udp_jmp_env , 1 );
}

int RecvData(int iTimeout, struct commhb *rcv_hb)

{

         char sBuffer[512];

         int  iRcvLen;

         int  iRet;

         

         iRet = 0;

         alarm(iTimeout);

         signal ( SIGALRM , handle_timeout );        

         if ( setjmp ( udp_jmp_env ) != 0 )

         {

                   iRet = alarm(0);

                   printf("Into setjmp.\n");

                   return(1);



         }

         memset(sBuffer, 0, sizeof(sBuffer) );

         if ((iRcvLen=recv(server_fd, sBuffer, MAXDATASIZE, 0)) == -1)

         {

                   perror("recv error");

                   printf("errno=%d [%s]\n", errno, strerror(errno));

                   return(2);

         }

         memcpy( (char *)rcv_hb, sBuffer+2, sizeof(struct commhb) );

         alarm(0);

         return(0);

}  


其中,下面这两句的顺序调整过,结果一样
         alarm(iTimeout);
         signal ( SIGALRM , handle_timeout );

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-12-19 13:18 |只看该作者
第2个问题 参考这篇文章.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D6

后面我用sigsetjmp, siglongjmp 测试成功了。而且涉及到信号的长跳转也应该用sigsetjmp, siglongjmp

论坛徽章:
0
3 [报告]
发表于 2005-12-19 14:55 |只看该作者
谢谢mq110这么快就对问题进行了响应!

我看了你链接的那个例子, 单独运行该例子确实能够起到每次超时的作用, 但由于我的函数是堵塞式监听SOCKET, 发生超时的时候必须回到超时的那个函数再错误返回, 就存在调转的问题。

我用建议的sigsetjmp, siglongjmp替换了原来setjmp和longjmp,以及用
setitimer代替alarm,问题还是依旧

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-12-19 15:11 |只看该作者
原帖由 call_center 于 2005-12-19 14:55 发表
谢谢mq110这么快就对问题进行了响应!

我看了你链接的那个例子, 单独运行该例子确实能够起到每次超时的作用, 但由于我的函数是堵塞式监听SOCKET, 发生超时的时候必须回到超时的那个函数再错误返回, 就 ...


那就检查一下你的代码吧.

论坛徽章:
0
5 [报告]
发表于 2005-12-19 16:38 |只看该作者
原帖由 mq110 于 2005-12-19 15:11 发表


那就检查一下你的代码吧.



再次感谢mq110的提醒, 问题已经解决, 之前只是简单地用sigsetjmp, siglongjmp替换了原来setjmp和longjmp, 后面仔细地看了sigsetjmp的帮助文档, 原来是需要在sigsetjmp 中加入信号值,sigsetjmp( udp_jmp_env, SIGALRM ) , 就搞定了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP