00001
00002
00003
00004
00005
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
00029
00030
00031 if ((ddpHandler->list[sender->senderNumber].ip != IP_ADDR_ANY) &&
00032 (SystemCall::getTimeSince(ddpHandler->list[sender->senderNumber].timeLastSeen) < 10000) &&
00033 (size<1400))
00034 {
00035
00036 char* ende = static_cast<char*>(packet);
00037
00038
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
00048 sender->sendDone();
00049 }
00050 udpHandler->doRegularStuff();
00051
00052 }
00053
00054 void UDPHandlerEndpoint::onSendingDone()
00055 {
00056 sender->sendDone();
00057 }
00058
00059 void UDPHandlerEndpoint::onReceive(void *data, int size)
00060 {
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 if (ddpHandler->list[sender->senderNumber].ip == ipOfLastPackage)
00072 {
00073
00074 int packetSize = *(int*)data;
00075
00076
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
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
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196