Esempio n. 1
0
Client* ClientConnectionSet::Add(LPSOCKADDR_IN addr)
{
    int newclientnum;

    // Get a random uniq client number
    Client* testclient;
    do
    {
        newclientnum = psserver->rng->Get(0x8fffff); //make clientnum random
        testclient = FindAny(newclientnum);
    }
    while(testclient != NULL);

    // Have uniq client number, create the new client
    Client* client = new Client();
    if(!client->Initialize(addr, newclientnum))
    {
        Bug1("Client Init failed?!?\n");
        delete client;
        return NULL;
    }

    CS::Threading::RecursiveMutexScopedLock lock(mutex);
    addrHash.PutUnique(SockAddress(client->GetAddress()), client);
    hash.Put(client->GetClientNum(), client);
    return client;
}
Esempio n. 2
0
    int UDPSocket::recv(void * data, int size) {
        int bytes;
        struct sockaddr_storage saddr;
        socklen_t length = sizeof (saddr);
        BOOST_ASSERT(data != NULL);
        BOOST_ASSERT(sock >= 0);
        bytes = ::recvfrom(sock, data, size, 0, (struct sockaddr *) &saddr, &length);
        // TODO: Implement status error (eg. Conn closed, ...)
        if (bytes < 0)
            throw ErrException("UDPSocket", "recvfrom");

        if (bytes == 0) {
            //Socket is now closed
            BOOST_VERIFY(sock < 0);
            return 0;
        }

        /**
         * recv doesn't set the after-the-last byte to zero. We must do it to
         * avoid some issues.
         * (writing into a prefilled longer data buffer f***s everything up)
         */
        if (bytes < size)
            ((char*) data)[bytes] = 0;
        lastRecvAddr = SockAddress((const sockaddr *) &saddr);
        return bytes;
    }
Esempio n. 3
0
int main()
{

    UdpDriver  drv;
    drv.Init(1);
    UdpSocketHandlerSharedPtr pHdlr(new PingPangUdpHandler());
    drv.SetHandler(pHdlr);
    UdpSocket svr;
    if(svr.Init())
    {
        return -1;
    }
    if(svr.Bind(SockAddress(1234,"127.0.0.1")))
    {
        return -1;
    }
    drv.AddSocket(svr.GetFD());
    while(1)
    {
        if(drv.Loop(1,10) < 0)
        {
            return -1;
        }
    }
    return 0;
}
Esempio n. 4
0
SockAddress SockAddress::v4(unsigned int address)
{
    unsigned char *data = new unsigned char[4];
    data[0] = address >> 24;
    data[1] = address >> 16;
    data[2] = address >> 8;
    data[3] = address;
    return SockAddress(V4, data);
}
Esempio n. 5
0
SockAddress SockAddress::v4(unsigned char a, unsigned char b,
                            unsigned char c, unsigned char d)
{
    unsigned char *data = new unsigned char[4];
    data[0] = a;
    data[1] = b;
    data[2] = c;
    data[3] = d;
    return SockAddress(V4, data);
}
 void Socket::updateLocalAddress() {
     EPYX_ASSERT(sock >= 0);
     struct sockaddr_storage saddr;
     socklen_t saddr_len = sizeof (saddr);
     if (::getsockname(sock, (struct sockaddr *) &saddr, &saddr_len) < 0) {
         log::warn << "Socket::updateLocalAddress: getsockname error "
             << log::errstd << log::endl;
         // Do nothing
         return;
     }
     // Update address
     localAddress = SockAddress((struct sockaddr *) &saddr);
 }
Esempio n. 7
0
    URI::URI(const std::string& uri)
    :scheme(""), addr(), path("") {
        std::string location;

        // Extract scheme
        size_t pos = uri.find("://");
        if (pos != std::string::npos) {
            scheme = uri.substr(0, pos);
            location = uri.substr(pos + 3);
        } else {
            location = uri;
        }
        String::toLower(scheme);

        // Extract address
        pos = location.find('/');
        if (pos != std::string::npos) {
            addr = SockAddress(location.substr(0, pos));
            path = location.substr(pos);
        } else {
            addr = SockAddress(location);
        }
    }
Esempio n. 8
0
Client* ClientConnectionSet::Find(LPSOCKADDR_IN addr)
{
    CS::Threading::RecursiveMutexScopedLock lock(mutex);

    return addrHash.Get(SockAddress(*addr), NULL);
}
Esempio n. 9
0
SockAddress SockAddress::v4(unsigned char *address)
{
    unsigned char *data = new unsigned char[4];
    ::memcpy(data, address, 4);
    return SockAddress(V4, data);
}