| giuliomoro@336 | 1 /* | 
| giuliomoro@336 | 2  * udpClient.cpp | 
| giuliomoro@336 | 3  * | 
| giuliomoro@336 | 4  *  Created on: 19 May 2015 | 
| giuliomoro@336 | 5  *      Author: giulio moro | 
| giuliomoro@336 | 6  */ | 
| giuliomoro@336 | 7 #include <UdpClient.h> | 
| giuliomoro@336 | 8 | 
| giuliomoro@336 | 9 	UdpClient::UdpClient(){ | 
| giuliomoro@336 | 10 		outSocket=socket(AF_INET, SOCK_DGRAM, 0); | 
| giuliomoro@336 | 11 		setSocketBroadcast(1); | 
| giuliomoro@336 | 12 		isSetPort=false; | 
| giuliomoro@336 | 13 		isSetServer=false; | 
| giuliomoro@336 | 14 		enabled=false; | 
| giuliomoro@336 | 15 	} | 
| giuliomoro@336 | 16 	UdpClient::UdpClient(int aPort, const char* aServerName){ | 
| giuliomoro@336 | 17 		outSocket=socket(AF_INET, SOCK_DGRAM, 0); | 
| giuliomoro@336 | 18 		if(outSocket<0){ | 
| giuliomoro@336 | 19 			enabled=false; | 
| giuliomoro@336 | 20 			return; | 
| giuliomoro@336 | 21 		} | 
| giuliomoro@336 | 22 		setSocketBroadcast(1); | 
| giuliomoro@336 | 23 		setPort(aPort); | 
| giuliomoro@336 | 24 		setServer(aServerName); | 
| giuliomoro@336 | 25 		isSetPort=true; | 
| giuliomoro@336 | 26 		isSetServer=true; | 
| giuliomoro@336 | 27 		enabled=true; | 
| giuliomoro@336 | 28 		memset(&stTimeOut, 0, sizeof(struct timeval)); | 
| giuliomoro@336 | 29 	} | 
| giuliomoro@336 | 30 	UdpClient::~UdpClient(){ | 
| giuliomoro@336 | 31 	   close(outSocket); | 
| giuliomoro@336 | 32 	} | 
| giuliomoro@336 | 33 	void UdpClient::setPort(int aPort){ | 
| giuliomoro@336 | 34 		port=aPort; | 
| giuliomoro@336 | 35 		destinationServer.sin_port = htons(port); | 
| giuliomoro@336 | 36 		destinationServer.sin_family = AF_INET; | 
| giuliomoro@336 | 37 		isSetPort=true; | 
| giuliomoro@336 | 38 		if(isSetServer){ | 
| giuliomoro@336 | 39 			enabled=true; | 
| giuliomoro@336 | 40 		} | 
| giuliomoro@336 | 41 	}; | 
| giuliomoro@336 | 42 	void UdpClient::setServer(const char* aServerName){ | 
| giuliomoro@336 | 43 		inet_pton(AF_INET,aServerName,&destinationServer.sin_addr); | 
| giuliomoro@336 | 44 		isSetServer=true; | 
| giuliomoro@336 | 45 		if(isSetPort){ | 
| giuliomoro@336 | 46 			enabled=true; | 
| giuliomoro@336 | 47 		} | 
| giuliomoro@336 | 48 	}; | 
| giuliomoro@336 | 49 	int UdpClient::send(void * message, int size){ | 
| giuliomoro@336 | 50 		if(!enabled) | 
| giuliomoro@336 | 51 			return -1; | 
| giuliomoro@336 | 52 		unsigned int length; | 
| giuliomoro@336 | 53 		length=sizeof(struct sockaddr_in); | 
| giuliomoro@336 | 54 		int n=sendto(outSocket,message,size,0,(const struct sockaddr *)&destinationServer,length); | 
| giuliomoro@336 | 55 		if (n < 0){ | 
| giuliomoro@336 | 56 			return n; | 
| giuliomoro@336 | 57 		} | 
| giuliomoro@336 | 58 		return 1; | 
| giuliomoro@336 | 59 	}; | 
| giuliomoro@336 | 60 	int UdpClient::write(const char* remoteHostname, int remotePortNumber, void* sourceBuffer, int numBytesToWrite){ | 
| giuliomoro@336 | 61 		setServer(remoteHostname); | 
| giuliomoro@336 | 62 		setPort(remotePortNumber); | 
| giuliomoro@336 | 63 		return send(sourceBuffer, numBytesToWrite); | 
| giuliomoro@336 | 64 	} | 
| giuliomoro@336 | 65   int UdpClient::waitUntilReady(bool readyForReading, int timeoutMsecs){ | 
| giuliomoro@336 | 66 //	If the socket is ready on return, this returns 1. If it times-out before the socket becomes ready, it returns 0. If an error occurs, it returns -1. | 
| giuliomoro@336 | 67     if(enabled==false) | 
| giuliomoro@336 | 68 		return -1; | 
| giuliomoro@336 | 69     if(timeoutMsecs<0) | 
| giuliomoro@336 | 70 		return select(outSocket+1, NULL, &stWriteFDS, NULL, NULL); //calling this with a NULL timeout will block indefinitely | 
| giuliomoro@336 | 71     FD_ZERO(&stWriteFDS); | 
| giuliomoro@336 | 72     FD_SET(outSocket, &stWriteFDS); | 
| giuliomoro@336 | 73 	float timeOutSecs=timeoutMsecs*0.001; | 
| giuliomoro@336 | 74 	stTimeOut.tv_sec=(int)timeOutSecs; | 
| giuliomoro@336 | 75 	timeOutSecs-=(int)timeOutSecs; | 
| giuliomoro@336 | 76 	stTimeOut.tv_usec=(int)(timeOutSecs*1000000); | 
| giuliomoro@336 | 77     int descriptorReady= select(outSocket+1, NULL, &stWriteFDS, NULL, &stTimeOut); | 
| giuliomoro@336 | 78     return descriptorReady>0? 1 : descriptorReady; | 
| giuliomoro@336 | 79   } | 
| giuliomoro@336 | 80 	int	UdpClient::setSocketBroadcast(int broadcastEnable){ | 
| giuliomoro@336 | 81 		int ret = setsockopt(outSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); | 
| giuliomoro@336 | 82 		if(ret < 0){ | 
| giuliomoro@336 | 83 			printf("Impossible to set the socket to Broadcast\n"); | 
| giuliomoro@336 | 84 		} | 
| giuliomoro@336 | 85 		return ret; | 
| giuliomoro@336 | 86 	} |