int Mediator::initClient(char* ip, int cmd_fd, int cmd_port, int data_port, int time_port, int info_port){ int data_fd = socketManager->find_data_fd(ip, data_port); string client_ip(ip); ClientNode node(client_ip, cmd_port, cmd_fd, data_fd, time_port, info_port); clientList.setActiveClient(node); }
/* * * Recebe os HELLO packets dos clientes e zera o tempo deles. * */ static void* receive_hellos(void *param) { int iSockFd=-1; int iLength=0; struct sockaddr_in servAddr,cliAddr; char buff[1024]; iSockFd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); memset(&servAddr,0,sizeof(servAddr)); memset(&cliAddr,0,sizeof(cliAddr)); servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(Server::server_ip.c_str()); servAddr.sin_port=htons(HELLO_PORT); int cliAddrLen=sizeof(struct sockaddr_in); int bindRet=bind(iSockFd,(struct sockaddr*)&servAddr,sizeof(servAddr)); //cout <<"Bind returned "<<bindRet<<endl; while(true) { int num_bytes = recvfrom(iSockFd,buff,1024,0, (struct sockaddr*)&cliAddr,(socklen_t*)&cliAddrLen); /* pegar IP do client que mandou HELLO */ std::string client_ip(inet_ntoa(cliAddr.sin_addr)); /* zerar tempo de HELLO do client SE ele existir */ if(clients.count(client_ip) != 1) { /* recebeu HELLO de client NAO registrado */ cout << "Received HELLO packet from non registered client"; cout << ": ip=" << client_ip << endl; } else { clients[client_ip].received_hello(); } //close(iSockFd); } }
//-------------------------------------------------------------- unsigned int Reactor::_allow(Protocol* const protocol, const long fd){ std::string client_ip(128, 0); std::string client_name(128, 0); libwebsockets_get_peer_addresses((int)fd, &client_name[0], client_name.size(), &client_ip[0], client_ip.size()); return protocol->_allowClient(client_name, client_ip); }
//-------------------------------------------------------------- unsigned int Reactor::_allow(struct libwebsocket *ws, Protocol* const protocol, const long fd){ std::string client_ip(128, 0); std::string client_name(128, 0); libwebsockets_get_peer_addresses(context, ws, libwebsocket_get_socket_fd(ws), &client_name[0], client_name.size(), &client_ip[0], client_ip.size()); return protocol->_allowClient(client_name, client_ip); }
unsigned int WebSockets::onAllow( WebSocketProtocol* protocol ,const long fd ) { string client_ip(128, 0); string client_name(128, 0); libwebsockets_get_peer_addresses( (int)fd ,&client_name[0] ,client_name.size() ,&client_ip[0] ,client_ip.size() ); return protocol->allowClient(client_name, client_ip); }
void handleConnect (RPCServerImp::pointer new_connection, boost::system::error_code const& error) { bool delay = false; if (!error) { // Restrict callers by IP std::string client_ip ( new_connection->getRemoteEndpoint ().address ().to_string ()); if (! isClientAllowed (client_ip)) { startListening (); return; } new_connection->getSocket ().async_handshake (AutoSocket::ssl_socket::server, std::bind (&RPCServer::connected, new_connection)); } else { if (error == boost::system::errc::too_many_files_open) delay = true; WriteLog (lsINFO, RPCDoor) << "RPCDoorImp::handleConnect Error: " << error; } if (delay) { mDelayTimer.expires_from_now (boost::posix_time::milliseconds (1000)); mDelayTimer.async_wait (std::bind (&RPCDoorImp::startListening, this)); } else { startListening (); } }
void Mediator:: initRemote(char* msg, int cmd_fd){ string username = string(strtok(msg, "|\n")); int data_port = atoi(strtok(NULL, "|\n")); char* ip = socketManager->getPeerIP(cmd_fd); int cmd_port = socketManager->getPeerPort(cmd_fd); int data_fd = socketManager->find_data_fd(ip, data_port); string client_ip(ip); ClientNode node(client_ip, cmd_port, cmd_fd, data_fd, 0, 0); int filedes[2]; pipe(filedes); pid_t childpid; if ((childpid = fork()) < 0){ cerr << "Can not fork!\n"; return; } else if (childpid == 0){ char c_temp[64]; ioStream->readLine(filedes[0], c_temp, 64); //sleep(1); RemoteHandler remote_handler(node, username, socketManager); remote_handler.run(); _exit(7); } else { ZombieHandleThread z_thread(childpid); socketManager->closeByFD(cmd_fd); socketManager->closeByFD(data_fd); const char *p_temp = "Here goes child\n"; ioStream->writen(filedes[1], p_temp, strlen(p_temp)); } }