Network timeout Detection (1)
Set the properties of the socket So_rcvtimeo
Reference code:
struct Timeval TV;
TV.. tv_sec=5;//Set 5s time
tv.tv_usec=0;
SetSockOpt (SOCKFD,SOL_SOCKET,SO_RCVTIMEO,&TV,SIZEOF (TV));//Set Receive timeout
Recv/recvfrom
Network Timeout Check (2)
Use Select to detect if the socket is ' ready '
Reference code:
struct Fd_set Rdfds;
struct Timeval tv={5,0};
Fd_zero (&rdfds);
Fd_set (Sockfd,&rdfds);
if (Selecet (SOCKFD+1,&RDFS,NULL,NULL,&TV) >0)//socket ready
{
Recv/recvfrom
}
Selct-timeout.c
#include <stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<unistd.h>#include<string.h>#include<netinet/inch.h>#include<arpa/inet.h>#include<sys/time.h>#defineN 128#defineErr_log (ErrLog) do{perror (ErrLog); exit (1);} while (0)intMainintargcConst Char*argv[]) {Fd_set Readfds; intmaxfd; inti =0; CharBuf[n] = {}; intret; intSOCKFD; intacceptfd; structsockaddr_in serveraddr, clientaddr; socklen_t Addrlen=sizeof(CLIENTADDR); if(ARGC <3) {fprintf (stderr,"usage:%s ServerIP port.\n", argv[0]); } if(SOCKFD = socket (af_inet, Sock_stream,0)) <0) {Err_log ("fail to socket"); } serveraddr.sin_family=af_inet; Serveraddr.sin_addr.s_addr= Inet_addr (argv[1]); Serveraddr.sin_port= Htons (Atoi (argv[2])); if(Bind (SOCKFD, (structSOCKADDR *) &serveraddr,sizeof(SERVERADDR)) <0) {Err_log ("fail to bind"); } if(Listen (SOCKFD,5) <0) {Err_log ("fail to listen"); } Fd_zero (&Readfds); Maxfd=SOCKFD; structTimeval TV; while(1) {Fd_set (0, &Readfds); Fd_set (SOCKFD,&Readfds); Tv.tv_sec=5; Tv.tv_usec=0; if(ret =Select(maxfd+1, &readfds, NULL, NULL,&TV)) <0) {Err_log ("fail to select"); } printf ("After select.\n"); Switch(ret) { Case 0: printf ("timeout....\n"); Break; default : for(i =0; I < maxfd+1; i++) { if(Fd_isset (I, &Readfds)) { if(i = =0) {fgets (buf, N, stdin); printf ("buf:%s", BUF); } if(i = =sockfd) { if(Acceptfd = Accept (SOCKFD, (structsockaddr*) (&CLIENTADDR, &addrlen)) <0) {Err_log ("fail to accept"); } printf ("%s----- ACCEPTFD =%d\n", Inet_ntoa (CLIENTADDR.SIN_ADDR), Ntohs (Clientaddr.sin_port), ACCEPTFD); } } } //End Default}//Endswitch } return 0;}
Network Timeout (3)
Set the timer (timer) to capture the SIGALRM signal
Reference code:
void handler (int signo) {return;}
Once the process receives this signal, after executing the signal processing function, the next function will return directly, without blocking where
struct Sigaction Act;
Sigaction (sigalrm,null,&act);
Act.sa_handler=handler
act.sa_flag&=~sa_restart;
Sigaction (Sigalrm,&act,null);
Alarm (5)
if (recv (...) <0) ....
Server-alarm.c
#include <stdio.h>#include<string.h>#include<stdlib.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/inch.h>#include<arpa/inet.h>#include<signal.h>#include<errno.h>#defineErr_log (ErrLog) do{perror (ErrLog); exit (1);} while (0)#defineN 128//./server 192.168.0.196 10000voidHandlerintSIG) {printf ("timeout....\n");}intMainintargcConst Char*argv[]) { intSOCKFD; intCONFD; structsockaddr_in serveraddr, clientaddr; CharBuf[n] = {}; if(ARGC! =3) {fprintf (stderr,"usage:%s ServerIP port.\n", argv[0]); return-1; } if(SOCKFD = socket (af_inet, Sock_stream,0)) <0) {Err_log ("fail to socket"); } printf ("SOCKFD =%d\n", SOCKFD); Serveraddr.sin_family=af_inet; Serveraddr.sin_addr.s_addr= Inet_addr (argv[1]); Serveraddr.sin_port= Htons (Atoi (argv[2])); if(Bind (SOCKFD, (structsockaddr*) &serveraddr,sizeof(SERVERADDR)) <0) {Err_log ("fail to bind"); } if(Listen (SOCKFD,Ten) <0) {Err_log ("fail to listen"); } socklen_t Addrlen=sizeof(structsockaddr); if(CONFD = Accept (SOCKFD, (structSOCKADDR *) &clientaddr, &addrlen) <0) {Err_log ("fail to accept"); } printf ("CONFD =%d,%s-and%d \ n", CONFD, Inet_ntoa (CLIENTADDR.SIN_ADDR), Ntohs (Clientaddr.sin_port)); structSigaction Act; Sigaction (SIGALRM, NULL,&Act); Act.sa_handler=handler; Act.sa_flags&= ~Sa_restart; Sigaction (SIGALRM,&Act, NULL); while(1) {Alarm (5); if(Recv (CONFD, buf, N,0) <0) { if(errno = =4) {printf ("errno =%d\n", errno); } Else{Err_log ("fail to recv"); }} printf ("From client:%s\n", BUF); } close (SOCKFD); return 0;}
Compile run, if the client does not enter for 5 seconds, you can see
Linux Network Programming--time-out detection