00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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;
00065 }
00066
00067 int
00068 XrdMonSndTransmitter::operator()(const XrdMonSndPacket& packet)
00069 {
00070 static int packetNo = 0;
00071 ++ packetNo;
00072
00073
00074
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
00090
00091 return 0;
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