Mar 19, 2009

linux下c语言socket programming的timeout

cpe416 distributed systems课上的作业要求写一个简单的socket(UDP) program - facility booking system,用client-server的模式写。其中有一个timeout的要求,意思是:client给server发送一个请求,过了一段时间(譬如5秒)之后(timeout了)如果没有收到server的回复,client要再次给server发送请求。

我们group是在linux下用C写这个的,到了timeout这个地方的时候,在网上找到了一个例子。但是原本的code显示timeout功能不怎么明了,我把它改了一点,如下:

#include <STDIO.H> 
#include <SYS/time.h>
#include <SIGNAL.H>
#include <STDLIB.H>

void catch_alarm(int);
void aaa();

int main(){
// install signal hander catch_alarm
// to handle the signal SIGALRM
signal(SIGALRM, catch_alarm);
// to start the timer
alarm(5);

aaa();

return EXIT_SUCCESS;
}

// this is the handler called by kernal
// when timer counts to 0
void catch_alarm(int sig){
printf("Alarm Occurred.\n");
}

// pause at the scanf() line to demonstrate
// the timeout function
void aaa(){
int x;
printf("Please enter an integer: ");
// pause at this line
// after catch_alarm() handles the SIGALRM
// signal, this method continues from here
scanf("%d", &x);
printf("You entered %d.\n", x);
}

上面的signal和alarm两个function是这个timeout的重点了。signal这个function的作用呢,正如comments上面些的那样,它会install一个signal handler给SIGALRM这个signal。然后呢,等这个signal到了的时候“signal handler function for a signal is called ’catching the signal‘.”那么,什么时候这个signal来到?这要看alarm()中写了什么。alarm的定义为:

unsigned int alarm(unsigned int seconds); 

alarm()的作用就是会让系统在seconds秒之后generate一个SIGALRM的信号来,这个时候signal handler也就是catch_alarm()这个么method就会被调用来处理这个signal了。

signal被处理以后这个程序是怎么往下走的呢,这就是上面的例子所要演示的了。当程序print出来“Please enter an integer:“的时候现不要输东西,等到五秒过后,屏幕上会出来“Alarm Occurred.”字样,这说明signal已经来了,而catch_alarm被调用了。这时候再随便打一个数字,按enter,屏幕上又会有“You entered .”字样。这说明signal来的时候,主程序暂停,handler被调用。而handle过了以后,主程序从哪里停的,它便会从哪里继续下去。

No comments:

Post a Comment