static int info_prop_handler(lo_arg **argv, int argc, void *user_data, info_reply_func_t cb) { sosc_state_t *state = user_data; const char *host = NULL; char port[6]; lo_address *dst; if (argc == 2) host = &argv[0]->s; else host = lo_address_get_hostname(state->outgoing); portstr(port, argv[argc - 1]->i); if (!(dst = lo_address_new(host, port))) { fprintf(stderr, "sys_info_handler(): error in lo_address_new()"); return 1; } cb(dst, state); lo_address_free(dst); return 0; }
// Creates an EndPoint from its string representation // withNetMask = true --> string contains netmask // withNetMask = false --> string doesnt contain netmask void EndPoint::fromString(const std::string & epstr) { std::string::size_type i = epstr.find(':', 0); std::string ipstr(epstr, 0, i); std::string::size_type j = epstr.find('|', i); std::string portstr(epstr, i+1, j-i-1); std::string::size_type k = epstr.find('_', j); std::string protostr(epstr, j+1, k-j-1); ipAddr.fromString(ipstr); portNr = atoi(portstr.c_str()); protocolID = atoi(protostr.c_str()); return; }
void HeartbeatThread::requestMasterServerList2(struct sockaddr_in addr) { int sock = -1; try { sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(sock < 0) { std::stringstream msg; msg << "Couldn't create socket: " << strerror(errno); throw std::runtime_error(msg.str()); } // connect to server int res = connect(sock, (struct sockaddr*) &addr, sizeof(addr)); if(res < 0) { std::stringstream msg; msg << "Couldn't connect to masterserver: " << strerror(errno) << "\n"; throw std::runtime_error(msg.str()); } SocketStream stream(sock); sock = -1; // stream has control over the socket now stream << "\\list\\gamename\\master\\final\\" << std::flush; Tokenizer* tokenizer = new Tokenizer(stream); std::string ip = ""; int port = 28900; while(!stream.eof()) { std::string token = tokenizer->getNextToken(); if(token == "ip") { if(ip != "") addMasterServer(ip, port); ip = tokenizer->getNextToken(); port = 28900; } else if(token == "port") { std::stringstream portstr(tokenizer->getNextToken()); portstr >> port; } else if(token == "final") { break; } else { *log << "Unknown token when querying for masterserverlist: " << token << std::endl; } }
void FilterEndPoint::fromString(const std::string & fepstr, bool withNetmask) { if (withNetmask == true) { std::string::size_type h = fepstr.find('/', 0); std::string ipstr(fepstr, 0, h); std::string::size_type i = fepstr.find(':', h); std::string netmaskstr(fepstr, h+1, i-h-1); std::string::size_type j = fepstr.find('|', i); std::string portstr(fepstr, i+1, j-i-1); std::string::size_type k = fepstr.find('_', j); std::string protostr(fepstr, j+1, k-j-1); ipAddr.fromString(ipstr); if (atoi(netmaskstr.c_str()) > 0 && atoi(netmaskstr.c_str()) < 32) { nmask = atoi(netmaskstr.c_str()); ipAddr.remanent_mask(nmask); } else if (atoi(netmaskstr.c_str()) == 0) { nmask = 0; } else if (atoi(netmaskstr.c_str()) < 0 || atoi(netmaskstr.c_str()) > 32) { std::cerr << "WARNING:: Invalid Netmask occured in FilterEndPoint::fromString()!\n" << " Netmask may only be a value " << "between 0 and 32! Thus, 32 will be assumed for now!\n"; nmask = 32; } portNr = atoi(portstr.c_str()); protocolID = atoi(protostr.c_str()); } else { this->EndPoint::fromString(fepstr); nmask = 32; } return; }
void ServerQueryThread::onDataReceived(network::TCPSocket *s, const char *data, const int len) { string str; MSInfo * msi = querying_msdata[s]; msi->touch(); str = msi->recdata; str.append(data,len); if (str[0] != '\\') { delete msi; querying_msdata.erase(s); s->destroy(); return; // invalid answer; } string lastpart; if (str[str.length()-1] != '\\') { // received incomplete string::size_type p = str.rfind('\\'); msi->recdata = str.substr(p); str.erase(p); } else { msi->recdata = "\\"; } StringTokenizer tknizer(str,'\\'); string token = tknizer.getNextToken(); while ( !token.empty()) { if ( token == "ip" ) { string dirip = tknizer.getNextToken(); string port; if ( dirip.empty() ) { msi->recdata.insert(0,"\\ip\\"); break; } token = tknizer.getNextToken(); if ( token.empty() ) { msi->recdata.insert(0,dirip.insert(0,"\\ip\\")+"\\"); break; } if ( token == "port" ) { token = tknizer.getNextToken(); if (token.empty()) { msi->recdata.insert(0,dirip.insert(0,"\\ip\\")+"\\port\\"); break; } port=token; token = tknizer.getNextToken(); } LOGGER.warning("Server IP received: [%s:%s]",dirip.c_str(),port.c_str()); int iport; std::stringstream portstr(port); portstr >> iport; bool found=false; // check if it is already in list std::vector<masterserver::ServerInfo*>::iterator si; for ( si = serverlist->begin(); si != serverlist->end(); si++) { if ( ((*si)->address == dirip) && ((*si)->port == iport) ) { found=true; break; } } if (found) continue; ServerInfo * info = new ServerInfo(); info->address = dirip; info->port = iport; info->status = ServerInfo::QUERYING; serverlist->push_back(info); not_queried.push_back(info); sendNextQuery(); // XXX first check it is not already in } else if ( token == "final") {