Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Platform/Aperios1.3.2/UDPHandler.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file  Platform/Aperios1.3.2/UDPHandler.cpp
00003 *
00004 * Class for using NetSender/NetReceivers over UDP 
00005 * @author <A href=mailto:robocup@m-wachter.de>Michael Wachter</A>
00006 * 
00007 */
00008 
00009 #include "UDPHandler.h"
00010 #include <tools/debugging/debugging.h>
00011 
00012 #include <stdio.h>
00013 #include <iostream.h>
00014 
00015 UDPHandlerEndpoint::UDPHandlerEndpoint() : UDPEndpoint(2048,2048)
00016 {
00017       lastReceivedSerial=0;
00018     sendSerial=0;
00019 }
00020 
00021 UDPHandlerEndpoint::~UDPHandlerEndpoint()
00022 {
00023 
00024 };
00025 
00026 void UDPHandlerEndpoint::sendPackage(int senderNumber, void* packet, int size)
00027 {
00028   // cout << "Sender " << senderNumber << " wants to send :" ;
00029  
00030   // Checks if the IP in the DDP-list ist actual and the data to send is not bigger than 1400 bytes
00031   if ((ddpHandler->list[sender->senderNumber].ip != IP_ADDR_ANY) && 
00032     (SystemCall::getTimeSince(ddpHandler->list[sender->senderNumber].timeLastSeen) < 10000) &&
00033     (size<1400))
00034   {
00035     // cout << " sending to " << ddpHandler.list[senderNumber].ip << " \n " << flush;
00036       char* ende = static_cast<char*>(packet);
00037       
00038     // sending a serial number at the end of the package to detect packet loss. 
00039       ende += size;
00040       sendSerial++;
00041       memcpy(ende,&sendSerial,4);
00042     send((char*)(packet),size+4,ddpHandler->list[sender->senderNumber].ip,
00043        TEAMPORTBASE + (int)getPlayer().getPlayerNumber());
00044    }
00045   else
00046   {
00047   // cout << " no target ";
00048      sender->sendDone();
00049   }
00050   udpHandler->doRegularStuff(); /* used to trigger the DDP */
00051   // cout << "\n" << flush;
00052 }
00053 
00054 void UDPHandlerEndpoint::onSendingDone()
00055  {
00056    sender->sendDone();
00057  }
00058 
00059 void UDPHandlerEndpoint::onReceive(void *data, int size)
00060 {
00061 
00062    /*  cout << "UDPHandlerEndpoint::onReceive() ";
00063    cout << size << " " << sender->senderNumber << " ";   // 13
00064    char pN = ((char*)data)[17] ;
00065    cout << ((int)pN) << " ";
00066    cout << "listip: " << ddpHandler->list[sender->senderNumber].ip << " ip: " << ipOfLastPackage ;
00067    cout << "\n"; */
00068 
00069     
00070     
00071      if (ddpHandler->list[sender->senderNumber].ip == ipOfLastPackage)
00072      {
00073         // cout << " handler " << i ;
00074         int packetSize = *(int*)data;
00075 
00076     // getting serial number
00077     char* ende = static_cast<char*>(data);
00078         ende += packetSize;
00079         ende += 4;
00080         int serial;
00081         memcpy(&serial,ende,4);
00082 
00083 
00084         if (serial != lastReceivedSerial + 1)
00085         {
00086              OUTPUT(idText,text,
00087                "Packet-Loss from " << ipOfLastPackage << " detected.(Serial:"
00088                << serial << " last package:" << lastReceivedSerial 
00089                << ")" << serial-lastReceivedSerial+1 << " Packets missing");
00090         }
00091 
00092         lastReceivedSerial = serial;
00093 
00094     // transfering the package to the receiver
00095         receiver->getPackage(packetSize); 
00096         memcpy(receiver->package, (char*)data + 4, packetSize);
00097         receiver->onReceive();
00098      }
00099    else
00100    {
00101          cout << "ip <-> DDP-ip mismatch \n";
00102    }
00103   
00104 }
00105 
00106 
00107 UDPHandler::UDPHandler()
00108 {
00109    numberOfEndpoints = 0;
00110 }
00111 
00112 void UDPHandler::addSenderAndReceiver(NetSenderBase& sender, NetReceiverBase& receiver)
00113 {
00114     endPoints[numberOfEndpoints].sender = &sender;
00115   endPoints[numberOfEndpoints].receiver = &receiver;
00116   endPoints[numberOfEndpoints].sender->setHandler(&endPoints[numberOfEndpoints]);
00117     endPoints[numberOfEndpoints].sender->getPackage(2048);
00118   endPoints[numberOfEndpoints].sender->senderNumber = numberOfEndpoints;
00119     endPoints[numberOfEndpoints].receiver->getPackage(2048);
00120   endPoints[numberOfEndpoints].ddpHandler = &ddpHandler;
00121   endPoints[numberOfEndpoints].udpHandler = this;
00122   numberOfEndpoints++;
00123 
00124 }
00125 void UDPHandler::start()
00126 {
00127     ddpHandler.initDDPHandler();
00128   int i;
00129   int j = 0;
00130   for (i=0; i< Player::numOfPlayerNumbers; i++)
00131     {
00132       if ((int)getPlayer().getPlayerNumber() != i)
00133     {
00134            endPoints[j].bind(TEAMPORTBASE+i);   
00135            j++;
00136     }
00137     }
00138 }
00139 
00140 void UDPHandler::doRegularStuff()
00141 {
00142     ddpHandler.sendDDPPackage();
00143 }
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151   // cout << "\n";
00152 
00153 
00154 
00155 
00156 /*
00157  * Change log :
00158  * 
00159  * $Log: UDPHandler.cpp,v $
00160  * Revision 1.2  2004/09/12 20:10:47  wachter
00161  * Documentation-fixes
00162  *
00163  * Revision 1.1.1.1  2004/05/22 17:23:41  cvsadm
00164  * created new repository GT2004_WM
00165  *
00166  * Revision 1.8  2004/05/14 14:12:08  wachter
00167  * - Added communication support for 5 robots
00168  * - rewrote parts of team-communication to be faster and more stable
00169  *
00170  * Revision 1.7  2004/05/14 12:20:28  tim
00171  * fixed typo
00172  *
00173  * Revision 1.6  2004/01/26 13:44:07  wachter
00174  * shared-memory-buffers now have variable sizes
00175  *
00176  * Revision 1.5  2004/01/23 18:28:47  wachter
00177  * Added detection of lost packets
00178  *
00179  * Revision 1.4  2004/01/21 17:33:09  wachter
00180  * UDP Team-communication now working with packets<1400 bytes.
00181  * Not activated at the moment.
00182  *
00183  * Revision 1.3  2004/01/20 14:21:41  wachter
00184  * - Added sender-number to NetSender
00185  * - worked on with Team-Communication
00186  *
00187  * Revision 1.2  2004/01/09 15:44:30  wachter
00188  * Worked on with the Dog-Discovery-Protocol
00189  *
00190  * Revision 1.1  2003/12/21 19:27:03  wachter
00191  * Added classes for Sender/Receiver over TCP and UDP.
00192  * ( PLEASE DO NOT USE THIS NOW ! )
00193  *
00194  * 
00195  */
00196 

Generated on Thu Sep 23 19:57:34 2004 for GT2004 by doxygen 1.3.6