Linux C Socket with timeout

From Luniwiki
Jump to: navigation, search

Example

#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netdb.h>
char uri[500];
char request[MAX_SOCKET];
char *cur_p;
struct hostent *server;
struct sockaddr_in serveraddr;
int port = 80;
struct timeval Timeout;
Timeout.tv_sec = 2;
Timeout.tv_usec = 0;
int err;
fd_set Read, Write, Err;
int i; 
	int tcpSocket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
	if (tcpSocket < 0)
	{
		return 1;
	}
	FD_ZERO(&Read);
	FD_ZERO(&Write);
	FD_ZERO(&Err);
	FD_SET(tcpSocket, &Read);
	FD_SET(tcpSocket, &Write);
	FD_SET(tcpSocket, &Err);
	/* Resolve the IP */
	server = gethostbyname("www.luniel.com");
	if (server == NULL)
	{
		return 1;
	}
	bzero((char *) &serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = server->h_addrtype; //AF_INET or AF_INET6
	bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length); 
	serveraddr.sin_port = htons(port);
	//set the socket in non-blocking
	unsigned long iMode = 1;
	int iResult = ioctl(tcpSocket, FIONBIO, &iMode);
	if (iResult != 0)
	{	
		return 1;
	}
	if (connect(tcpSocket, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) != 0)
	{
		err = errno;
		if (err != EINPROGRESS ){
			return 1;
		}		
	}
	// restart the socket mode
	iMode = 0;
	iResult = ioctl(tcpSocket, FIONBIO, &iMode);
	if (iResult != 0)
	{	
		return 1;
	}
       /* Set timeouts to send and receive data */
       if (setsockopt (tcpSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&Timeout,sizeof(Timeout)) < 0)
       {	
              return 1;
       }
       if (setsockopt (tcpSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&Timeout,sizeof(Timeout)) < 0)
       {	
              return 1;
       }
	// Check if socket is ready, and if not timeout after 2 seconds
	int n;
	n=select(tcpSocket+1,&Read,&Write,NULL,&Timeout);
	if ( n <= 0) {
		return 1;
	}
	bzero(request, MAX_SOCKET);
	sprintf(request, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", "/index.html, "www.luniel.com");
	if (send(tcpSocket, request, strlen(request), 0) < 0)
	{
		return 1;
	}
	bzero(request, MAX_SOCKET); 
	recv(tcpSocket, request, MAX_SOCKET-1, 0);

References

Daniel Simao (talk) 10:08, 15 October 2018 (EDT)