XrdMonSndTransmitter.cc

Go to the documentation of this file.
00001 /*****************************************************************************/
00002 /*                                                                           */
00003 /*                         XrdMonSndTransmitter.cc                           */
00004 /*                                                                           */
00005 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */
00006 /*                            All Rights Reserved                            */
00007 /*       Produced by Jacek Becla for Stanford University under contract      */
00008 /*              DE-AC02-76SF00515 with the Department of Energy              */
00009 /*****************************************************************************/
00010 
00011 // $Id: XrdMonSndTransmitter.cc 24468 2008-06-22 16:47:03Z ganis $
00012 
00013 #include "XrdMon/XrdMonCommon.hh"
00014 #include "XrdMon/XrdMonUtils.hh"
00015 #include "XrdMon/XrdMonSndDebug.hh"
00016 #include "XrdMon/XrdMonSndTransmitter.hh"
00017 #include "XrdSys/XrdSysHeaders.hh"
00018 
00019 #include <netdb.h>
00020 #include <netinet/in.h>
00021 #include <stdio.h>
00022 #include <sys/socket.h>
00023 #include <sys/types.h>
00024 #include <unistd.h>
00025 #include <string.h>
00026 
00027 #include <string>
00028 using std::cerr;
00029 using std::cout;
00030 using std::endl;
00031 
00032 XrdMonSndTransmitter::XrdMonSndTransmitter()
00033     : _socket(-1)
00034 {}
00035 
00036 int
00037 XrdMonSndTransmitter::initialize(const char* receiverHost, kXR_int16 receiverPort)
00038 {
00039     _socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
00040     
00041     if ( -1 == _socket ) {
00042         cerr << "Failed to initialize socket" << endl;
00043         return 1;
00044     }
00045 
00046     memset((char *) &_sAddress, sizeof(_sAddress), 0);
00047     _sAddress.sin_family = AF_INET;
00048     _sAddress.sin_port = htons(receiverPort);
00049 
00050     if ( *receiverHost >= '0' && *receiverHost <= '9' ) {
00051         if (inet_aton(receiverHost, &_sAddress.sin_addr)==0) {
00052             cerr << "inet_aton() failed, host: " << receiverHost << endl;
00053             return 2;
00054         }
00055     } else {
00056         struct hostent* h = gethostbyname(receiverHost);
00057         if ( h == NULL ) {
00058             cout << "Error, invalid host \"" << receiverHost << "\"" << endl;
00059             return 3;
00060         }
00061         memcpy(&(_sAddress.sin_addr.s_addr), h->h_addr, h->h_length);
00062     }
00063     
00064     return 0; // success
00065 }
00066 
00067 int
00068 XrdMonSndTransmitter::operator()(const XrdMonSndPacket& packet)
00069 {
00070     static int packetNo = 0;
00071     ++ packetNo;
00072 
00073     //if ( messThingsUp(packet,  packetNo) ) {
00074     //    return 0;
00075     //}
00076     
00077     if ( XrdMonSndDebug::verbose(XrdMonSndDebug::Sending) ) {
00078         cout << "Sending packet no " << packetNo << endl;
00079     }
00080     int ret = sendto(_socket, packet.data(), packet.size(), 0, 
00081                      (sockaddr *)& _sAddress, 
00082                      sizeof(_sAddress) );
00083 
00084     if ( ret == -1 ) {
00085         cerr << "Failed to send data" << endl;
00086         return 2;
00087     }
00088 
00089     //usleep(500);
00090     
00091     return 0; // success
00092 }
00093 
00094 void
00095 XrdMonSndTransmitter::shutdown()
00096 {
00097     close(_socket);
00098 }
00099 
00100 bool
00101 XrdMonSndTransmitter::messThingsUp(const XrdMonSndPacket& packet, int packetNo)
00102 {
00103     static XrdMonSndPacket *outOfOrder25 = 0, *outOfOrder270 = 0;
00104     if ( packetNo == 25 ) {
00105         outOfOrder25 = new XrdMonSndPacket(packet);
00106         cout << "JJJ XrdMonSndPacket no " << packetNo << " will be sent later." << endl;
00107         return true;
00108     }
00109 
00110     if ( packetNo == 15 || 
00111          packetNo == 23 ||
00112          packetNo == 24 ||
00113          packetNo == 26 ||
00114          packetNo == 27    ) {
00115         cout << "JJJ Loosing packet no " << packetNo << endl;
00116         return true;
00117     }
00118     if ( packetNo == 270 ) {
00119         outOfOrder270 = new XrdMonSndPacket(packet);
00120         cout << "JJJ XrdMonSndPacket no " << packetNo << " will be sent later." << endl;
00121         return true;
00122     }
00123     if ( packetNo == 280 ) {
00124         cout << "JJJ Sending packet no 270 now." << endl;
00125         sendto(_socket, outOfOrder270->data(), outOfOrder270->size(), 0, 
00126                (sockaddr *)& _sAddress, 
00127                sizeof(_sAddress) );
00128         delete outOfOrder270;
00129         outOfOrder270 = 0;
00130     }
00131 
00132     if ( packetNo == 55 ) {
00133         cout << "JJJ Sending packet no 25 now." << endl;
00134         sendto(_socket, outOfOrder25->data(), outOfOrder25->size(), 0, 
00135                (sockaddr *)& _sAddress, 
00136                sizeof(_sAddress) );
00137         delete outOfOrder25;
00138         outOfOrder25 = 0;
00139     }
00140     return false;
00141 }
00142 

Generated on Tue Jul 5 14:46:43 2011 for ROOT_528-00b_version by  doxygen 1.5.1