快速业务通道

UDP实现简单的超时重传

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
中断的系统调用(用在刚才说的 例子上就是:继续redvfrom……)这中默认处理方式大多数时候很有用,但是 我们这里就不行了,那这个问题怎么解决呢?要解决这个问题,就不能单纯的用signal函数 去设置中断处理程序了,而是要用另一个函数:sigactiong,

sigaction函数如下:

/***********函数:sigaction函数(知道的可以不用看 ****************/

#include <signal.h>

#include <types.h>

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);

功能:拦截下signum消息,用act所给的方式处理,将原来的处 理方式存在oldact(一般oldact设为NULL);

参数:signum:需要拦截的消息,这里 是SIGALRM;

act:处理中断的方式,是一个结构体,后面会介绍这结构体;

oldact:用来存储原来的处理方式,一般为NULL,表示忽略;

/****************************************************************/

/ ***********结构体:struct sigaction(知道的可以不用看) *******/

struct sigaction
{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}

成员:第一个sa_handler就是中断处理程序的入口,比如:要用alarm程序 处理这个中断,就讲此值设为alarm;

sa_mask:表示在中断处理中要屏蔽的中断;

sa_flags:这是很关键的东西~它包含了一些影响中断处理过程方式的标志,具体取 值如下:

SA_NOCLDSTOP:这表示如果所处理的中断是SIGCHLD,由于收到其他信号而 导致了子进程终止,将不发送SIG_CHLD;

SA_ONESHOT or SA_RESETHAND:sa_handler 所指向的中断处理程序只被执行一次,之后将设为默认的中断处理程序;

SA_RESTART :让被处理的系统调用在中断返回后重新执行;

SA_NOMASK or SA_NODEFFER(这就是 我们要用的):在中断处理程序执行时,不平比自己的中断信号;

要考虑的成员就是 上面的两个至于其他两个于要处理的问题关系不大,大家可以查书看看

/***********************************************************/

好啦~ 到这说的就差不多了~下面举个例子(这不是个完全的程序,只是写了我们所关心的部分)

代码:

 

/*省略include*/
int main()
{
/*省略部分变量定义*/
struct sigaction alr;
memset(&alr,0,sizeof(struct sigaction));
alr.sa_handler=alarmed;/*用alarmed函数处理*/
alr.sa_flags=SA_NOMASK;/*具体含义见前文*/
alr.sa_restorer-NULL;
sigaction(SIGALRM,&alr,NULL);/*需要捕捉SIGALRM消息,具体处理方式在alr结构体中 ,不关心原来的处理方式*/
/*假设有一个已经设置好的struct sockaddr_in的结构体,名字是addr,和一个已经用bind 函数处理完的套接字,变量名是:fd*/
for( ; ; )
{
alarm(60);/*60秒后,如果仍处于阻塞状态就重传*/
recvfrom(/*具体参数我就不说了,反正就是调用了一个recvfrom函数);*/
/*以下省略若干*/
}
}
void alarmed(int signo)
{
sendto(/*向发送端传送特殊数据包(自己定义,爱什么样什么样),当发送端收到这数据包 后,就重传一遍刚才发送的数据(自然这个功能你得自己写……)*/
return;
}
/*

 

这个程序……反正大家看懂就好啦~省略了很多检验机制 ……别跟我学…………*/

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号