00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "TCPEndpoint.h"
00012 #include <TCPEndpointMsg.h>
00013 #include <stdio.h>
00014 #include <iostream.h>
00015
00016 #define MAXSENDSIZE 8192
00017
00018 TCPEndpoint::TCPEndpoint(int sendBufferSize, int receiveBufferSize)
00019 :IPEndpoint(sendBufferSize, receiveBufferSize)
00020 {
00021 status=closed;
00022 address="";
00023 port=0;
00024 wasListening=false;
00025 }
00026
00027 TCPEndpoint::TCPEndpoint(char* address,int port)
00028 : IPEndpoint()
00029 {
00030 connect(address, port);
00031 }
00032
00033 TCPEndpoint::~TCPEndpoint()
00034 {
00035 close();
00036 }
00037
00038
00039
00040
00041
00042
00043
00044 int TCPEndpoint::connect(char* address, int port)
00045 {
00046
00047 antEnvCreateEndpointMsg tcpCreateMsg( EndpointType_TCP, 8192);
00048 tcpCreateMsg.Call(ipStackRef, sizeof(tcpCreateMsg));
00049
00050 if (tcpCreateMsg.error != ANT_SUCCESS)
00051 {
00052 cout << "TCPEndpoint::connect(): Can't create Endpoint, error " << antErrorString(tcpCreateMsg.error);
00053 return(1);
00054 }
00055
00056 endpoint = tcpCreateMsg.moduleRef;
00057
00058
00059
00060 TCPEndpointConnectMsg connectMsg(endpoint, IP_ADDR_ANY, IP_PORT_ANY,
00061 address, port);
00062
00063 connectMsg.continuation = this;
00064 connectMsg.Send(ipStackRef, *myOID_ , *connectContSelector, sizeof(connectMsg));
00065
00066 status=connecting;
00067 return(0);
00068 }
00069
00070 void TCPEndpoint::connectCont(antEnvMsg* msg)
00071 {
00072
00073 TCPEndpointConnectMsg* connectMsg = (TCPEndpointConnectMsg*) msg;
00074 if (connectMsg->error != TCP_SUCCESS)
00075 {
00076 cout << "TCPEndpoint::connectCont() Connection failed : " <<
00077 getErrorString(connectMsg->error) << " \n";
00078 status = closed;
00079 }
00080 else
00081 {
00082 status = connected;
00083 }
00084
00085
00086 if(status==connected)
00087 {
00088 onConnect();
00089 startReceiving();
00090 }
00091 }
00092
00093
00094 void TCPEndpoint::onConnect()
00095 {
00096 }
00097
00098
00099 int TCPEndpoint::listen(int listenPort)
00100 {
00101
00102 antEnvCreateEndpointMsg tcpCreateMsg( EndpointType_TCP, 8192);
00103 tcpCreateMsg.Call(ipStackRef, sizeof(tcpCreateMsg));
00104
00105 if (tcpCreateMsg.error != ANT_SUCCESS)
00106 {
00107 cout << "TCPEndpoint::listen() : Can't create Endpoint, error " << antErrorString(tcpCreateMsg.error);
00108 return(1);
00109 }
00110
00111 endpoint = tcpCreateMsg.moduleRef;
00112
00113 cout << "TCPEndpoint::listen(" << listenPort << ") \n";
00114 port = listenPort;
00115
00116
00117 TCPEndpointListenMsg listenMsg(endpoint, IP_ADDR_ANY, port);
00118 listenMsg.continuation=this;
00119 VERIFY(*listenContSelector!=0);
00120 listenMsg.Send(ipStackRef, *myOID_, *listenContSelector, sizeof(listenMsg));
00121
00122 status=listening;
00123
00124 return(0);
00125 }
00126
00127
00128
00129 void TCPEndpoint::listenCont(antEnvMsg* msg)
00130 {
00131
00132 TCPEndpointListenMsg* listenMsg = (TCPEndpointListenMsg*) msg;
00133 if (listenMsg->error != TCP_SUCCESS)
00134 {
00135 cout << "TCPEndpoint::listenCont() : Listen failed : " <<
00136 getErrorString(listenMsg->error) << "\n";
00137
00138 return;
00139 }
00140 else
00141 {
00142 status=connected;
00143 wasListening=true;
00144 onConnect();
00145 startReceiving();
00146 }
00147 }
00148
00149
00150
00151 int TCPEndpoint::send(void* data,int size)
00152 {
00153
00154 sendDataBuffer = data;
00155 sizeOfDataToSend = size;
00156
00157 if (status == connected)
00158 {
00159 if (status != sending)
00160 {
00161 if (size>sharedSendBufferSize) size=sharedSendBufferSize;
00162 memcpy(sharedSendBuffer,sendDataBuffer,size);
00163
00164
00165 sendSendMessage(size);
00166
00167 (char*)sendDataBuffer += size;
00168 sizeOfDataToSend-=size;
00169
00170 return(0);
00171 }
00172 else
00173 {
00174 return(-1);
00175 }
00176 }
00177 else
00178 {
00179 cout << "TCPEndpoint::send() : Not connected \n";
00180 return(-2);
00181 }
00182
00183 }
00184
00185 void TCPEndpoint::sendCont(antEnvMsg* msg)
00186 {
00187
00188
00189 TCPEndpointSendMsg* sendMsg = (TCPEndpointSendMsg*) msg;
00190 if (sendMsg->error != TCP_SUCCESS)
00191 {
00192 cout << "TCPEndpoint: Send error :"
00193 << getErrorString(sendMsg->error) << "\n";
00194 close();
00195 return;
00196 }
00197
00198
00199
00200 int size = sizeOfDataToSend;
00201 if (size>sharedSendBufferSize) size=sharedSendBufferSize;
00202
00203
00204
00205 if (size > 0)
00206 {
00207 memcpy(sharedSendBuffer,sendDataBuffer,size);
00208 sendSendMessage(size);
00209 status = sending;
00210 sizeOfDataToSend-=size;
00211 (char*)sendDataBuffer += size;
00212 }
00213 else
00214 {
00215 status= connected;
00216 onSendingDone();
00217 }
00218 }
00219
00220 void TCPEndpoint::sendSendMessage(int size)
00221 {
00222 TCPEndpointSendMsg sendMsg(endpoint, sharedSendBuffer, size);
00223 sendMsg.continuation = this;
00224 sendMsg.Send(ipStackRef, *myOID_, *sendContSelector, sizeof(sendMsg));
00225 status = sending;
00226 }
00227
00228 void TCPEndpoint::onSendingDone()
00229 {
00230 return;
00231 }
00232
00233
00234 void TCPEndpoint::startReceiving()
00235 {
00236
00237 status = connected;
00238 TCPEndpointReceiveMsg receiveMsg(endpoint,sharedReceiveBuffer,1,8192);
00239
00240 receiveMsg.continuation = this;
00241 receiveMsg.Send(ipStackRef, *myOID_, *receiveContSelector, sizeof(receiveMsg));
00242 }
00243
00244 void TCPEndpoint::receiveCont(antEnvMsg* msg)
00245 {
00246
00247
00248 TCPEndpointReceiveMsg* receiveMsg = (TCPEndpointReceiveMsg*) msg;
00249 if (receiveMsg->error != TCP_SUCCESS)
00250 {
00251 if (receiveMsg->error == TCP_CONNECTION_BUSY)
00252 {
00253
00254 return;
00255 }
00256 else
00257 {
00258 cout << "TCPEndpoint::receiveCont() : Error receiving " <<
00259 getErrorString(receiveMsg->error) << "\n";
00260 onClose(receiveMsg->error);
00261 close();
00262 return;
00263 }
00264
00265 }
00266
00267 onReceive(sharedReceiveBuffer,receiveMsg->sizeMin);
00268 startReceiving();
00269 status=connected;
00270 }
00271
00272 void TCPEndpoint::onReceive(void* Data, int size)
00273 {
00274
00275 }
00276
00277
00278
00279
00280
00281 int TCPEndpoint::close()
00282 {
00283
00284 if ((status != closing) && (status != closed))
00285 {
00286 TCPEndpointCloseMsg closeMsg(endpoint);
00287 closeMsg.continuation = this;
00288 closeMsg.Send(ipStackRef, *myOID_, *closeContSelector, sizeof(closeMsg));
00289 status=closing;
00290 }
00291 return(0);
00292 }
00293
00294
00295 void TCPEndpoint::onClose(int reason)
00296 {
00297
00298 }
00299
00300 void TCPEndpoint::closeCont(antEnvMsg* msg)
00301 {
00302
00303 TCPEndpointCloseMsg* closeMsg = (TCPEndpointCloseMsg*) msg;
00304 if (closeMsg->error != TCP_SUCCESS)
00305 {
00306 cout << "TCPEndpoint::onClose() : error closing : "
00307 << getErrorString(closeMsg->error) << "\n";
00308 status = closed;
00309 }
00310 if (wasListening)
00311 {
00312 listen(port);
00313 }
00314
00315 }
00316
00317
00318 const char* TCPEndpoint::getErrorString(TCPEndpointError error)
00319 {
00320 switch (error)
00321 {
00322 case TCP_BUFFER_INVALID: return "TCP_BUFFER_INVALID (Address not in shared memory)";
00323 case TCP_CONNECTION_BUSY: return "TCP_CONNECTION_BUSY (Another operaation is in Progress)";
00324 case TCP_CONNECTION_CLOSED: return "TCP_CONNECTION_CLOSED";
00325 case TCP_CONNECTION_RESET: return "TCP_CONNECTION_RESET";
00326 case TCP_CONNECTION_TIMEOUT: return "TCP_CONNECTION_TIMEOUT";
00327 case TCP_FAIL: return "TCP_FAIL (no more information is avialble)";
00328 case TCP_HOST_UNREACHABLE: return "TCP_HOST_UNREACHABLE";
00329 case TCP_MESSAGE_TOO_LONG: return "TCP_MESSAGE_TOO_LONG";
00330 case TCP_NETWORK_UNREACHABLE: return "TCP_NETWORK_UNREACHABLE";
00331 case TCP_OPERATION_INVALID: return "TCP_OPERATION_INVALID";
00332 case TCP_OPERATION_UNKNOWN: return "TCP_OPERATION_UNKNOWN";
00333 case TCP_PORT_UNREACHABLE: return "TCP_PORT_UNREACHABLE";
00334 case TCP_PROTOCOL_UNREACHABLE: return "TCP_PROTOCOL_UNREACHABLE";
00335 case TCP_SUCCESS: return "TCP_SUCCESS";
00336 case TCP_TIME_EXCEEDED: return "TCP_TIME_EXCEEDED";
00337 case TCP_TTL_EXCEEDED: return "TCP_TTL_EXCEEDED";
00338
00339 default: return "TCP_UNKNOWN_ERROR please edit TCPEndpoint::getErrorSring";
00340 }
00341 }
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380