- 论坛徽章:
- 0
|
◎ 关于 alarm 和 socket 求助!!!!!
这是我的源码,你看看
int ALARM =0;
static jmp_buf env_alarm;
static void my_sig_alarm(int signo);
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in sin;
int sinlen = sizeof(sin);
char getbuf[256];
int i=0;
c_timeval timeo;
timeo.tv_sec = 10;
timeo.tv_usec = 0;
signal (SIGALRM, my_sig_alarm);
if (setjmp(env_alarm) <0) {
fprintf (stderr, "setjmp error\n" ;
return -1;
}
sock = socket(AF_INET, SOCK_DGRAM, 0);
sin.sin_family = AF_INET;
sin.sin_port = htons(9999);
sin.sin_addr.s_addr = htonl (INADDR_ANY);
bind(sock, (struct sockaddr *)&sin, sinlen);
/*
if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo)) <0) {
fprintf(stderr, "setsockopt error, errno=%d\n", errno);
return -1;
}
*/
alarm (1);
if (recvfrom(sock, getbuf, sizeof(getbuf), 0, (struct sockaddr *)&sin, (socklen_t*)&sinlen) <0) {
fprintf (stderr, "recvfrom errno, errno=%d\n", errno);
close(sock);
return -1;
}
alarm (0);
if (ALARM) {
fprintf(stderr, "Alarm, after recvfrom \n" ;
close(sock);
return 0;
}
fprintf(stderr, "normal timeout and exit\n" ;
close(sock);
return 0;
}
static void my_sig_alarm(int signo)
{
// signal (SIGALRM, my_sig_alarm);
ALARM = 1;
fprintf(stderr, "Alert: sig_alarm()...\n" ;
longjmp(env_alarm, 1);
return;
} |
|