Changeset 61 in cheroxy for trunk/src/CRXSocket.cpp


Ignore:
Timestamp:
01/25/13 17:54:39 (11 years ago)
Author:
cheese
Message:

#1 apply reuseaddr

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/CRXSocket.cpp

    r59 r61  
    1111#endif
    1212
    13 bool CRXSocket::mInitialized = false;
     13bool gInitialized = false;
    1414
    1515CRXSocket::CRXSocket (int aSocket)
    16     : mSocket (aSocket)
    1716{
    1817    /*----------------------------------------------------------------*/
     
    2019
    2120    memset ((void *)&mAddress, 0x0, sizeof (struct sockaddr_in));
     21
     22    Attach (aSocket);
    2223    /*----------------------------------------------------------------*/
    2324}
     
    3334CRXSocket::Attach (int aSocket)
    3435{
     36    int     aResult = 0;
     37    int     aReuseAddress = 0;
     38    size_t  aReuseAddressLength = sizeof (aReuseAddress);
     39
    3540    /*----------------------------------------------------------------*/
    3641    mSocket = aSocket;
     42
     43    if (mSocket < 0)
     44        return ;
     45
     46    aResult = GetOption (SO_REUSEADDR,
     47                         &aReuseAddress,
     48                         &aReuseAddressLength);
     49    if (aResult < 0)
     50    {
     51        aResult = ERROR_TCPSOCKET_FAILED_TO_GET_SOCKOPT;
     52        CRX_ERROR_SET (aResult, "Failed to get socket option (reuseaddr).(%d)", mSocket);
     53    }
     54
     55    if (aReuseAddress == 1)
     56        return ;
     57
     58    aReuseAddress = 1;
     59
     60    aResult = SetOption (SO_REUSEADDR,
     61                         &aReuseAddress,
     62                         sizeof (aReuseAddress));
     63    if (aResult < 0)
     64    {
     65        aResult = ERROR_TCPSOCKET_FAILED_TO_SET_SOCKOPT;
     66        CRX_ERROR_SET (aResult, "Failed to set socket option (reuseaddr).(%d)", mSocket);
     67    }
    3768    /*----------------------------------------------------------------*/
    3869}
     
    4576    /*----------------------------------------------------------------*/
    4677    mSocket = 0;
    47 
    4878    /*----------------------------------------------------------------*/
    4979    return aSocket;
     
    76106    /*----------------------------------------------------------------*/
    77107    return *this;
     108}
     109
     110int
     111CRXSocket::GetOption (const int aOptName,
     112                      void      * aOptVal,
     113                      size_t    * aOptLen)
     114{
     115    int aResult = 0;
     116
     117    /*----------------------------------------------------------------*/
     118    aResult = getsockopt (mSocket,
     119                          SOL_SOCKET,
     120                          aOptName,
     121#ifdef _WIN32
     122                          (char *) aOptVal,
     123#else
     124                          aOptVal,
     125#endif
     126                          (socklen_t *) aOptLen);
     127    if (aResult < 0)
     128    {
     129        aResult = ERROR_TCPSOCKET_FAILED_TO_GET_SOCKOPT;
     130        CRX_ERROR_SET (aResult, "Failed to get socket option.");
     131    }
     132    /*----------------------------------------------------------------*/
     133
     134    return aResult;
    78135}
    79136
     
    84141{
    85142    int aResult = 0;
     143
    86144    /*----------------------------------------------------------------*/
    87145    aResult = setsockopt (mSocket,
     
    162220#endif
    163221
    164     mInitialized = true;
     222    gInitialized = true;
    165223
    166224    /*----------------------------------------------------------------*/
     
    183241    /*----------------------------------------------------------------*/
    184242    /*----------------------------------------------------------------*/
    185     return mInitialized;
     243    return gInitialized;
    186244}
    187245
     
    206264{
    207265    int aResult = -1;
     266    int aReuseAddress = 1;
    208267
    209268    /*----------------------------------------------------------------*/
     
    219278    {
    220279        aResult = ERROR_TCPSOCKET_FAILED_TO_CREATE_SOCKET;
    221         CRX_ERROR_SET (aResult, "Failed to create socket(%d).", GetSystemErrorCode ());
     280        CRX_ERROR_SET (aResult, "Failed to create socket(%d).", CRX_SYSTEM_ERROR ());
    222281        return aResult;
    223282    }
     
    225284    mSocket = aResult;
    226285
    227     /*----------------------------------------------------------------*/
     286    aResult = SetOption (SO_REUSEADDR,
     287                         &aReuseAddress,
     288                         sizeof (aReuseAddress));
     289    if (aResult < 0)
     290    {
     291        aResult = ERROR_TCPSOCKET_FAILED_TO_SET_SOCKOPT;
     292        CRX_ERROR_SET (aResult, "Failed to set socket option (reuseaddr).");
     293    }
     294    /*----------------------------------------------------------------*/
     295
    228296    return aResult;
    229297}
     
    243311    {
    244312        aResult = ERROR_TCPSOCKET_FAILED_TO_CREATE_SOCKET;
    245         CRX_ERROR_SET (aResult, "Failed to create socket(%d).", GetSystemErrorCode ());
     313        CRX_ERROR_SET (aResult, "Failed to create socket(%d).", CRX_SYSTEM_ERROR ());
    246314        return aResult;
    247315    }
     
    267335    aLinger.l_linger = 0;
    268336    aResult = SetOption (SO_LINGER,
    269                           &aLinger,
    270                           sizeof (aLinger));
     337                         &aLinger,
     338                         sizeof (aLinger));
    271339    if (aResult < 0)
    272340    {
     
    279347    {
    280348        aResult = ERROR_TCPSOCKET_FAILED_TO_SET_TIMEOUT;
    281         CRX_ERROR_SET (aResult, "Failed to set timeout (%d).", GetSystemErrorCode ());
     349        CRX_ERROR_SET (aResult, "Failed to set timeout (%d).", CRX_SYSTEM_ERROR ());
    282350        return aResult;
    283351    }
     
    287355    {
    288356        aResult = ERROR_TCPSOCKET_FAILED_TO_CONNECT;
    289         CRX_ERROR_SET (aResult, "Failed to connect (%d).", GetSystemErrorCode ());
     357        CRX_ERROR_SET (aResult, "Failed to connect (%d).", CRX_SYSTEM_ERROR ());
    290358    }
    291359    /*----------------------------------------------------------------*/
     
    301369    int aResult = -1;
    302370
    303     int aReuseAddress = 1;
    304 
    305371    /*----------------------------------------------------------------*/
    306372    aResult = CreateSocket ();
     
    308374    {
    309375        aResult = ERROR_TCPSOCKET_FAILED_TO_CREATE_SOCKET;
    310         CRX_ERROR_SET (aResult, "Failed to create socket(%d).", GetSystemErrorCode ());
    311         return aResult;
    312     }
    313 
    314     aResult = SetOption (SO_REUSEADDR,
    315                          &aReuseAddress,
    316                          sizeof (aReuseAddress));
    317     if (aResult < 0)
    318     {
    319         aResult = ERROR_TCPSOCKET_FAILED_TO_SET_SOCKOPT;
    320         CRX_ERROR_SET (aResult, "Failed to set socket option (reuseaddr).");
     376        CRX_ERROR_SET (aResult, "Failed to create socket(%d).", CRX_SYSTEM_ERROR ());
     377        return aResult;
    321378    }
    322379
     
    329386    {
    330387        aResult = ERROR_TCPSOCKET_FAILED_TO_BIND;
    331         CRX_ERROR_SET (aResult, "Failed to bind(%d).", GetSystemErrorCode ());
     388        CRX_ERROR_SET (aResult, "Failed to bind(%d).", CRX_SYSTEM_ERROR ());
    332389        return aResult;
    333390    }
     
    337394    {
    338395        aResult = ERROR_TCPSOCKET_FAILED_TO_LISTEN;
    339         CRX_ERROR_SET (aResult, "Failed to listen(%d).", GetSystemErrorCode ());
     396        CRX_ERROR_SET (aResult, "Failed to listen(%d).", CRX_SYSTEM_ERROR ());
    340397        return aResult;
    341398    }
     
    346403        memcpy ((void *)aAddress, (void *)&mAddress, sizeof (struct sockaddr_in));
    347404    }
    348 
    349     /*----------------------------------------------------------------*/
     405    /*----------------------------------------------------------------*/
     406
    350407    return aResult;
    351408}
     
    359416    struct sockaddr_in  aAddress;
    360417    socklen_t           aLength = sizeof (aAddress);
    361 
    362418    /*----------------------------------------------------------------*/
    363419    if (!IsReady ())
     
    368424    {
    369425        aResult = ERROR_TCPSOCKET_FAILED_TO_ACCEPT;
    370         CRX_ERROR_SET (aResult, "Failed to accept(%d).", GetSystemErrorCode ());
     426        CRX_ERROR_SET (aResult, "Failed to accept(%d).", CRX_SYSTEM_ERROR ());
    371427        return aResult;
    372428    }
     
    380436    if (aAddressLength != NULL)
    381437        *aAddressLength = aLength;
    382 
    383     /*----------------------------------------------------------------*/
     438    /*----------------------------------------------------------------*/
     439
    384440    return aResult;
    385441}
     
    399455    {
    400456        aResult = ERROR_TCPSOCKET_FAILED_TO_SEND;
    401         CRX_ERROR_SET (aResult, "Failed to send(%d).", GetSystemErrorCode ());
    402         return aResult;
    403     }
    404 
    405     /*----------------------------------------------------------------*/
     457        CRX_ERROR_SET (aResult, "Failed to send(%d).", CRX_SYSTEM_ERROR ());
     458    }
     459    /*----------------------------------------------------------------*/
     460
    406461    return aResult;
    407462}
     
    421476    {
    422477        aResult = ERROR_TCPSOCKET_FAILED_TO_RECEIVE;
    423         CRX_ERROR_SET (aResult, "Failed to receive(%d).", GetSystemErrorCode ());
    424         return aResult;
    425     }
    426 
    427     /*----------------------------------------------------------------*/
    428     return aResult;
    429 }
     478        CRX_ERROR_SET (aResult, "Failed to receive(%d).", CRX_SYSTEM_ERROR ());
     479    }
     480    /*----------------------------------------------------------------*/
     481
     482    return aResult;
     483}
Note: See TracChangeset for help on using the changeset viewer.