#include #include #include #include #include #include #include #include #include #include #include #define BADSIGNAL ((void(*)(int))-1) #define TIMEOUT 5 void err_dump(const char* msg){ cerr << msg << ", errno=" << errno << endl; exit(1); } void alarm_signal(int){ cout << "signal received\n"; cout.flush(); } int main(){ struct sockaddr_in cli_addr,srv_addr; bzero( (char*)&srv_addr, sizeof(srv_addr) ); srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); srv_addr.sin_port = htons(192); bzero( (char*)&cli_addr, sizeof(cli_addr) ); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = htonl(INADDR_ANY); cli_addr.sin_port = htons(0); int sockfd = socket(AF_INET,SOCK_DGRAM,0);//IPPROTO_UDP); if(sockfd == -1){ err_dump("can't open socket"); } { int on=1; if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))==-1){ err_dump("error setsockopt"); } } if(bind(sockfd,(sockaddr*)&cli_addr,sizeof(cli_addr))== -1){ err_dump("can't bind to port"); } char buff[0x100]; /*** BEGIN AREA OF INTEREST ***/ struct sigaction action; action.sa_handler = alarm_signal; action.sa_flags = 0; sigemptyset(&(action.sa_mask)); /* ignore all known signals */ sigaction(SIGALRM,&action,NULL); /* ensures that SA_RESTART is NOT set */ int sz=sizeof(srv_addr); alarm(TIMEOUT); int st=recvfrom(sockfd,buff,sizeof(buff),0,(sockaddr*)&srv_addr,&sz); /*** END AREA OF INTEREST ***/ if(st == -1){ if(errno==EINTR){ cout << "timeout occured\n"; }else{ alarm(0); err_dump("error recvfrom"); } } close(sockfd); return 0; }