Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 11, 2005, 6:01:04 PM (18 years ago)
Author:
rennerc
Message:

handshake works now

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/network/src/lib/network/handshake.cc

    r6043 r6053  
    2727  this->setClassID(CL_HANDSHAKE, "Handshake");
    2828
    29   this->server = server;
     29  this->setIsServer(server);
    3030  this->clientId = clientId;
    31   this->state = HS_SEND_INIT;
     31  this->state = 0;
    3232  this->isOk = false;
     33  this->setOwner(0);
     34
     35  PRINTF(0)("Handshake created clientId = %d\n", clientId);
    3336}
    3437
    3538void Handshake::writeBytes( const byte * data, int length )
    3639{
    37   if ( state == HS_RECV_INIT )
     40  PRINTF(0)("Handshake::writeBytes states = %d %d %d %d (%d)\n", hasState( HS_RECVD_INIT ), hasState( HS_RECVD_VER ), hasState( HS_RECVD_HID ), hasState( HS_COMPLETED ), state);
     41
     42  if ( hasState( HS_COMPLETED ) )
     43       return;
     44
     45  if ( !hasState( HS_RECVD_INIT ) )
    3846  {
    3947    if ( length != _INITIAL_DATA_LENGTH )
    4048    {
    41       PRINTF(1)("initial packet has wrong size %d instead of %d\n", length, _INITIAL_DATA_LENGTH);
    42       state = HS_COMPLETED;
     49      PRINTF(0)("initial packet has wrong size %d instead of %d\n", length, _INITIAL_DATA_LENGTH);
     50      setState( HS_COMPLETED );
    4351      return;
    4452    }
     
    4654    if ( strncmp((char*)data, _INITIAL_DATA, length) )
    4755    {
    48       PRINTF(1)("initial packed does not match\n");
    49       state = HS_COMPLETED;
     56      PRINTF(0)("initial packed does not match\n");
     57      setState( HS_COMPLETED );
    5058      return;
    5159    }
    5260
    53     state = HS_SEND_VERSION;
     61    setState( HS_RECVD_INIT );
    5462    PRINTF(0)("got valid initial packet from client %d\n", clientId);
    5563    return;
    5664  }
    5765
    58   if ( state == HS_RECV_VERSION )
     66  if ( hasState( HS_RECVD_INIT ) && !hasState( HS_RECVD_VER ) )
    5967  {
    6068    if ( length != _ORXONOX_VERSION_LENGTH )
    6169    {
    62       PRINTF(1)("version number packet has wrong size %d instead of %d\n", length, _ORXONOX_VERSION_LENGTH);
    63       state = HS_COMPLETED;
     70      PRINTF(0)("version number packet has wrong size %d instead of %d\n", length, _ORXONOX_VERSION_LENGTH);
     71      setState( HS_COMPLETED );
    6472      return;
    6573    }
     
    6775    if ( strncmp((char*)data, _ORXONOX_VERSION, length) )
    6876    {
    69       PRINTF(1)("versions do not match\n");
    70       state = HS_COMPLETED;
     77      PRINTF(0)("versions do not match\n");
     78      setState( HS_COMPLETED );
    7179      return;
    7280    }
    7381
    74     if ( this->isServer() )
    75       state = HS_SEND_ID;
    76     else
    77       state = HS_RECV_ID;
     82    setState( HS_RECVD_VER );
    7883
    7984    PRINTF(0)("client %d's version does match\n", clientId);
     
    8186  }
    8287
    83   if ( state == HS_RECV_ID )
     88  if ( hasState( HS_RECVD_VER ) && !hasState( HS_RECVD_HID ) )
    8489  {
    85     if ( length != _ORXONOX_VERSION_LENGTH )
     90    if ( length != 4 )
    8691    {
    87       PRINTF(1)("hostID packet has wrong size %d instead of %d\n", length, 4);
    88       state = HS_COMPLETED;
     92      PRINTF(0)("hostID packet has wrong size %d instead of %d\n", length, 4);
     93      setState( HS_COMPLETED );
    8994      return;
    9095    }
    9196
    92     this->state = HS_COMPLETED;
     97    setState( HS_COMPLETED );
     98    setState( HS_RECVD_HID );
    9399    this->isOk = true;
    94100    memcpy(&(this->newHostId), data, 4);
     
    99105}
    100106
    101 int Handshake::readBytes( byte * data, int maxLength, int & reciever )
     107int Handshake::readBytes( byte * data, int maxLength, int * reciever )
    102108{
    103   if ( state == HS_SEND_INIT )
     109  PRINTF(0)("Handshake::readBytes states = %d %d %d %d (%d)\n", hasState( HS_SENT_INIT ), hasState( HS_SENT_VER ), hasState( HS_SENT_HID ), hasState( HS_COMPLETED ), state);
     110
     111  if ( hasState( HS_COMPLETED ) )
     112    return 0;
     113
     114  if ( !hasState( HS_SENT_INIT ) )
    104115  {
    105116    if ( maxLength < _INITIAL_DATA_LENGTH )
    106117    {
    107       PRINTF(1)("buffer too small for _INITIAL_DATA");
    108       state = HS_COMPLETED;
     118      PRINTF(0)("buffer too small for _INITIAL_DATA");
     119      setState( HS_COMPLETED );
    109120      return 0;
    110121    }
    111122
    112     state = HS_RECV_INIT;
     123    setState( HS_SENT_INIT );
    113124    memcpy(data, _INITIAL_DATA, _INITIAL_DATA_LENGTH);
    114125    if ( this->isServer() )
    115       reciever = clientId;
     126      *reciever = clientId;
    116127    return _INITIAL_DATA_LENGTH;
    117128  }
    118129
    119   if ( state == HS_SEND_VERSION )
     130  if ( hasState( HS_RECVD_INIT ) && hasState( HS_SENT_INIT ) && !hasState( HS_SENT_VER ) )
    120131  {
    121132    if ( maxLength < _ORXONOX_VERSION_LENGTH )
    122133    {
    123       PRINTF(1)("buffer too small for version number");
    124       state = HS_COMPLETED;
     134      PRINTF(0)("buffer too small for version number");
     135      setState( HS_COMPLETED );
    125136      return 0;
    126137    }
    127138
    128     state = HS_RECV_VERSION;
     139    setState( HS_SENT_VER );
    129140    memcpy(data, _ORXONOX_VERSION, _ORXONOX_VERSION_LENGTH);
    130141    if ( this->isServer() )
    131       reciever = clientId;
     142      *reciever = clientId;
    132143    return _ORXONOX_VERSION_LENGTH;
    133144  }
    134145
    135   if ( state == HS_SEND_ID )
     146  if ( isServer() && hasState( HS_RECVD_VER) && hasState( HS_SENT_VER ) && !hasState( HS_SENT_HID ) )
    136147  {
    137148    if ( maxLength < 4 )
    138149    {
    139       PRINTF(1)("buffer too small for ID");
    140       state = HS_COMPLETED;
     150      PRINTF(0)("buffer too small for ID");
     151      setState( HS_COMPLETED );
    141152      return 0;
    142153    }
    143154
    144     state = HS_COMPLETED;
     155    setState( HS_SENT_HID );
     156    setState( HS_COMPLETED );
     157    isOk = true;
    145158    memcpy(data, (byte*)&clientId, 4);
    146159    if ( this->isServer() )
    147       reciever = clientId;
     160      *reciever = clientId;
    148161    return 4;
    149162  }
Note: See TracChangeset for help on using the changeset viewer.