Beispiel #1
0
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") {