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; }
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; }
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; }
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); }
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); }
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); } }
Client* ClientConnectionSet::Find(LPSOCKADDR_IN addr) { CS::Threading::RecursiveMutexScopedLock lock(mutex); return addrHash.Get(SockAddress(*addr), NULL); }
SockAddress SockAddress::v4(unsigned char *address) { unsigned char *data = new unsigned char[4]; ::memcpy(data, address, 4); return SockAddress(V4, data); }