annotate core/UdpServer.cpp @ 213:c083217c4195 robbie

Got UdpServer from ClockSync
author Giulio Moro <giuliomoro@yahoo.it>
date Tue, 09 Feb 2016 15:52:35 +0000
parents
children
rev   line source
giuliomoro@213 1 /*
giuliomoro@213 2 * udpServer.cpp
giuliomoro@213 3 *
giuliomoro@213 4 * Created on: 19 May 2015
giuliomoro@213 5 * Author: giulio moro
giuliomoro@213 6 */
giuliomoro@213 7 #include "UdpServer.h"
giuliomoro@213 8
giuliomoro@213 9 UdpServer::UdpServer(int aPort){
giuliomoro@213 10 init(aPort);
giuliomoro@213 11 };
giuliomoro@213 12 UdpServer::UdpServer(){
giuliomoro@213 13 init(0);
giuliomoro@213 14 }
giuliomoro@213 15 UdpServer::~UdpServer(){
giuliomoro@213 16 close();
giuliomoro@213 17 };
giuliomoro@213 18 bool UdpServer::init(int aPort){
giuliomoro@213 19 enabled=true;
giuliomoro@213 20 stZeroTimeOut.tv_sec = 0; //set timeout to 0
giuliomoro@213 21 stZeroTimeOut.tv_usec = 0;
giuliomoro@213 22 inSocket=socket(AF_INET, SOCK_DGRAM, 0);
giuliomoro@213 23 if (inSocket < 0){
giuliomoro@213 24 enabled=false;
giuliomoro@213 25 }
giuliomoro@213 26 length = sizeof(server);
giuliomoro@213 27 server.sin_family=AF_INET;
giuliomoro@213 28 server.sin_addr.s_addr=INADDR_ANY;
giuliomoro@213 29 enabled=bindToPort(aPort);
giuliomoro@213 30 wasteBufferSize=2048;
giuliomoro@213 31 wasteBuffer=malloc(wasteBufferSize);
giuliomoro@213 32 memset(&stTimeOut,0,sizeof(struct timeval));
giuliomoro@213 33 return enabled;
giuliomoro@213 34 }
giuliomoro@213 35
giuliomoro@213 36 bool UdpServer::bindToPort(int aPort){
giuliomoro@213 37 port=aPort;
giuliomoro@213 38 if(port<1){
giuliomoro@213 39 enabled=false;
giuliomoro@213 40 return false;
giuliomoro@213 41 }
giuliomoro@213 42 server.sin_port=htons(port);
giuliomoro@213 43 if (bind(inSocket,(struct sockaddr *)&server,length)<0){
giuliomoro@213 44 enabled=false;
giuliomoro@213 45 return false;
giuliomoro@213 46 }
giuliomoro@213 47 enabled=true;
giuliomoro@213 48 return true;
giuliomoro@213 49 }
giuliomoro@213 50
giuliomoro@213 51 void UdpServer::close(){
giuliomoro@213 52 int ret=::close(inSocket);
giuliomoro@213 53 if(ret != 0)
giuliomoro@213 54 printf("Error while closing socket, errno: %d\n", errno);//Stop receiving data for this socket. If further data arrives, reject it.
giuliomoro@213 55 inSocket=0;
giuliomoro@213 56 }
giuliomoro@213 57
giuliomoro@213 58 int UdpServer::waitUntilReady(bool readyForReading, int timeoutMsecs){
giuliomoro@213 59 // 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@213 60 if(enabled==false)
giuliomoro@213 61 return -1;
giuliomoro@213 62 if(timeoutMsecs<0)
giuliomoro@213 63 return select(inSocket+1, &stReadFDS, NULL, NULL, NULL); //calling this with a NULL timeout will block indefinitely
giuliomoro@213 64 FD_ZERO(&stReadFDS);
giuliomoro@213 65 FD_SET(inSocket, &stReadFDS);
giuliomoro@213 66 float timeOutSecs=timeoutMsecs*0.001;
giuliomoro@213 67 stTimeOut.tv_sec=(long int)timeOutSecs;
giuliomoro@213 68 timeOutSecs-=(int)timeOutSecs;
giuliomoro@213 69 long int timeOutUsecs=timeOutSecs*1000000;
giuliomoro@213 70 stTimeOut.tv_usec=timeOutUsecs;
giuliomoro@213 71 int descriptorReady= select(inSocket+1, &stReadFDS, NULL, NULL, &stTimeOut);
giuliomoro@213 72 // printf("stTimeOut.tv_sec=%ld, stTimeOut.tv_usec=%ld, descriptorReady: \n",stTimeOut.tv_sec,stTimeOut.tv_usec, descriptorReady);
giuliomoro@213 73 // return descriptorReady>0 ? (timeOutUsecs-stTimeOut.tv_usec) : descriptorReady;
giuliomoro@213 74 return descriptorReady>0 ? 1 : descriptorReady;
giuliomoro@213 75 }
giuliomoro@213 76
giuliomoro@213 77 int UdpServer::read(//Returns the number of bytes read, or -1 if there was an error.
giuliomoro@213 78 void *destBuffer,
giuliomoro@213 79 int maxBytesToRead,
giuliomoro@213 80 bool blockUntilSpecifiedAmountHasArrived)
giuliomoro@213 81 {
giuliomoro@213 82 if(enabled==false)
giuliomoro@213 83 return -1;
giuliomoro@213 84 FD_ZERO(&stReadFDS);
giuliomoro@213 85 FD_SET(inSocket, &stReadFDS);
giuliomoro@213 86 int descriptorReady= select(inSocket+1, &stReadFDS, NULL, NULL, &stZeroTimeOut); //TODO: this is not JUCE-compliant
giuliomoro@213 87 if(descriptorReady<0){ //an error occurred
giuliomoro@213 88 return -1;
giuliomoro@213 89 }
giuliomoro@213 90 int numberOfBytes=0;
giuliomoro@213 91 // do
giuliomoro@213 92 {
giuliomoro@213 93 if (FD_ISSET(inSocket, &stReadFDS))
giuliomoro@213 94 {
giuliomoro@213 95 // numberOfBytes=recvfrom(inSocket,destBuffer,maxBytesToRead,0,(struct sockaddr *)&from,&fromLength);
giuliomoro@213 96 numberOfBytes+=recv(inSocket,destBuffer,maxBytesToRead-numberOfBytes,0);
giuliomoro@213 97 if(numberOfBytes<0)
giuliomoro@213 98 return -1;
giuliomoro@213 99 }
giuliomoro@213 100 }
giuliomoro@213 101 // while (blockUntilSpecifiedAmountHasArrived && numberOfBytes==maxBytesToRead);
giuliomoro@213 102 return numberOfBytes;
giuliomoro@213 103 }
giuliomoro@213 104 int UdpServer::empty(){
giuliomoro@213 105 return empty(0);
giuliomoro@213 106 }
giuliomoro@213 107 int UdpServer::empty(int maxCount){
giuliomoro@213 108 int count=0;
giuliomoro@213 109 int n;
giuliomoro@213 110 do {
giuliomoro@213 111 if(waitUntilReady(true, 0)==0)
giuliomoro@213 112 return 0;
giuliomoro@213 113 float waste;
giuliomoro@213 114 n=read(&waste, sizeof(float), false);
giuliomoro@213 115 count++;
giuliomoro@213 116 } while (n>0 && (maxCount<=0 || maxCount<count));
giuliomoro@213 117 printf("socket emptied with %d reads\n", count);
giuliomoro@213 118 return count;
giuliomoro@213 119 }