示例#1
0
void SignalProxy::removeAllPeers() {
  Q_ASSERT(proxyMode() == Server || _peers.count() <= 1);
  // wee need to copy that list since we modify it in the loop
  QList<QObject *> peers = _peers.keys();
  foreach(QObject *peer, peers) {
    removePeer(peer);
  }
示例#2
0
void Chord::run(string file){
	read(file); // Read Command from file

	// For each command, perform the repective function
	for(vector<Command>::iterator c = cmd.begin(); c != cmd.end(); c++){
		if (c->command.compare("init") == 0) {
			init(c->peer);
		}
		if (c->command.compare("addpeer") == 0) {
			addPeer(c->peer);
			updateFinger();
		}
		if (c->command.compare("insert") == 0) {
			insert(c->peer, c->message);
		}
		if (c->command.compare("print") == 0) {
			print(c->peer);
		}
		if (c->command.compare("delete") == 0) {
			Delete(c->peer, c->message);
		}
		if (c->command.compare("removepeer") == 0) {
			removePeer(c->peer);
			updateFinger();
		}
	}
}
///<summary> Remove the supplied service from the connection list and close it. </summary>
void removeConnection(POLYM_CONNECTION_INFO *connection_info)
{
	switch (connection_info->realm)
	{

	case POLY_REALM_SERVICE:
		// close a service control connection
		removeService(connection_info->connectionID);
		break;

	case POLY_REALM_PEER:
		// close a peer connection
		removePeer(connection_info->connectionID);
		break;

	default:
		break;
	}
}
示例#4
0
void Server::update(running_machine *machine)
{
    for(
        map<RakNet::RakNetGUID,vector< string > >::iterator it = unknownPeerInputs.begin();
        it != unknownPeerInputs.end();
        )
    {
        cout << "GOT UNKNOWN PEER INPUT\n";
        if(peerIDs.find(it->first)!=peerIDs.end())
        {
            int ID = peerIDs[it->first];
            for(int a=0;a<it->second.size();a++)
            {
                peerInputs[ID].push_back(it->second[a]);
            }
            map<RakNet::RakNetGUID,vector< string > >::iterator itold = it;
            it++;
            unknownPeerInputs.erase(itold);
        }
        else
        {
            it++;
        }
    }

    //cout << "SERVER TIME: " << RakNet::GetTimeMS()/1000.0f/60.0f << endl;
    //printf("Updating server\n");
    RakNet::Packet *p;
    for (p=rakInterface->Receive(); p; rakInterface->DeallocatePacket(p), p=rakInterface->Receive())
    {
        // We got a packet, get the identifier with our handy function
        unsigned char packetIdentifier = GetPacketIdentifier(p);

        //printf("GOT PACKET %d\n",int(packetIdentifier));

        // Check if this is a network message packet
        switch (packetIdentifier)
        {
        case ID_CONNECTION_LOST:
            // Couldn't deliver a reliable packet - i.e. the other system was abnormally
            // terminated
        case ID_DISCONNECTION_NOTIFICATION:
            // Connection lost normally
            printf("ID_DISCONNECTION_NOTIFICATION from %s\n", p->systemAddress.ToString(true));
            removePeer(p->guid,machine);
            break;


        case ID_NEW_INCOMING_CONNECTION:
            // Somebody connected.  We have their IP now
            printf("ID_NEW_INCOMING_CONNECTION from %s with GUID %s\n", p->systemAddress.ToString(true), p->guid.ToString());
            if(syncHappend)
            {
                //Sorry, too late
                //rakInterface->CloseConnection(p->systemAddress,true);
            }
            break;

        case ID_CLIENT_INFO:
            cout << "GOT ID_CLIENT_INFO\n";
            //This client is requesting candidacy, set their info
            {
                char buf[4096];
                strcpy(buf,(char*)(p->data+1));
                candidateNames[p->systemAddress] = buf;
            }

            //Find a session index for the player
            {
                char buf[4096];
                buf[0] = ID_SETTINGS;
                memcpy(buf+1,&secondsBetweenSync,sizeof(int));
                strcpy(buf+1+sizeof(int),username.c_str());
                rakInterface->Send(
                    buf,
                    1+sizeof(int)+username.length()+1,
                    HIGH_PRIORITY,
                    RELIABLE_ORDERED,
                    ORDERING_CHANNEL_SYNC,
                    p->guid,
                    false
                );
            }
            if(acceptedPeers.size()>=maxPeerID-1)
            {
                //Sorry, no room
                rakInterface->CloseConnection(p->systemAddress,true);
            }
            else if(acceptedPeers.size())
            {
                printf("Asking other peers to accept %s\n",p->systemAddress.ToString());
                waitingForAcceptFrom[p->systemAddress] = std::vector<RakNet::RakNetGUID>();
                for(int a=0; a<acceptedPeers.size(); a++)
                {
                    RakNet::RakNetGUID guid = acceptedPeers[a];
                    waitingForAcceptFrom[p->systemAddress].push_back(guid);
                    cout << "SENDING ADVERTIZE TO " << guid.ToString() << endl;
                    char buf[4096];
                    buf[0] = ID_ADVERTISE_SYSTEM;
                    strcpy(buf+1,p->systemAddress.ToString(true));
                    rakInterface->Send(buf,1+strlen(p->systemAddress.ToString(true))+1,HIGH_PRIORITY,RELIABLE_ORDERED,ORDERING_CHANNEL_SYNC,guid,false);
                }
                printf("Asking other peers to accept\n");
            }
            else
            {
                //First client, automatically accept
                acceptPeer(p->systemAddress,machine);
            }
            break;

        case ID_INCOMPATIBLE_PROTOCOL_VERSION:
            printf("ID_INCOMPATIBLE_PROTOCOL_VERSION\n");
            break;

        case ID_ACCEPT_NEW_HOST:
        {
            printf("Accepting new host\n");
            RakNet::SystemAddress saToAccept;
            saToAccept.SetBinaryAddress(((char*)p->data)+1);
            for(int a=0; a<waitingForAcceptFrom[saToAccept].size(); a++)
            {
                if(waitingForAcceptFrom[saToAccept][a]==p->guid)
                {
                    waitingForAcceptFrom[saToAccept].erase(waitingForAcceptFrom[saToAccept].begin()+a);
                    break;
                }
            }
            if(waitingForAcceptFrom[saToAccept].empty())
            {
                cout << "Accepting: " << saToAccept.ToString() << endl;
                waitingForAcceptFrom.erase(waitingForAcceptFrom.find(saToAccept));
                acceptPeer(saToAccept,machine);
            }
        }
        break;

        case ID_REJECT_NEW_HOST:
        {
            RakNet::SystemAddress saToReject;
            saToReject.SetBinaryAddress(((char*)p->data)+1);
            printf("Rejecting new client\n");
            cout << p->guid.ToString() << " REJECTS " << saToReject.ToString() << endl;
            if(waitingForAcceptFrom.find(saToReject)==waitingForAcceptFrom.end())
                printf("Could not find waitingForAcceptFrom for this GUID, weird");
            else
                waitingForAcceptFrom.erase(waitingForAcceptFrom.find(saToReject));
            rakInterface->CloseConnection(saToReject,true);
        }
        break;

        case ID_CLIENT_INPUTS:
            if(peerIDs.find(p->guid)==peerIDs.end() || peerInputs.find(peerIDs[p->guid])==peerInputs.end())
            {
                cout << __FILE__ << ":" << __LINE__ << " OOPS!!!!\n";
            }
            //cout << "GOT CLIENT INPUTS\n";
            peerInputs[peerIDs[p->guid]].push_back(string((char*)GetPacketData(p),(int)GetPacketSize(p)));
            break;
        default:
            printf("UNEXPECTED PACKET ID: %d\n",int(packetIdentifier));
            break;
        }

    }
}
示例#5
0
文件: toxcall.cpp 项目: qTox/qTox
void ToxGroupCall::onAudioSinkInvalidated(ToxPk peerId)
{
    removePeer(peerId);
    addPeer(peerId);
}
示例#6
0
t_stat ipc (ipc_funcs fn, char *arg1, char *arg2, char *arg3, int32 UNUSED arg4)
{
    //    if (!checkIPC())
    //        return SCPE_UDIS;
    
    switch (fn)
    {
        case ipcStart:
            if (actor)
                killIPC();
            
            actor = zactor_new (ipc_actor, arg1);
            assert (actor);
            deletePeers();          // remove all peers
            
            break;
            
        case ipcStop:
            ipc_printf("Stopping IPC ... ");
            killIPC();
            ipc_printf("deleted %d peers ... ", deletePeers());
            ipc_printf("done\n");
            break;
            
        case ipcRestart:
            ipc(ipcStop, 0, 0, 0, 0);           // kill IPC
            deletePeers();
            ipc(ipcStart, fnpName, 0, 0, 0);    // start IPC
            break;
            
        case ipcEnter:
            //sim_debug (DBG_VERBOSE, &ipc_dev, "%s/%s has entered " STR(IPC_GROUP) "\n", arg1, arg2);
            if (ipc_verbose)
              ipc_printf("(ENTER)      %s/%s has entered %s from %s\n", arg1, arg2, fnpGroup, arg3);
            
            savePeer(arg1, arg2);
            break;
            
        case ipcExit:
            //sim_debug (DBG_VERBOSE, &ipc_dev, "%s has left " STR(IPC_GROUP) "\n", arg1);
            if (ipc_verbose)
              ipc_printf("(EXIT)       %s/%s has left %s\n", arg1, arg2, fnpGroup);
            removePeer(arg1);
            break;
            
        case ipcShoutTx:
            zstr_sendx (actor, "SHOUT", arg1, NULL);
            break;
            
        case ipcWhisperTx:
#if 1
            if (arg1)   // WHISPER msg  (use last whisper peer)
            {
                IPC_Peer *p1 = findPeer(stripquotes(trim(arg1)));    // f**k for peer named 'name'
                if (p1)
                    strcpy(lastPeer, p1->peerID);   // save Peer id
                else
                {
                    bool bGuid = isGUID(stripquotes(trim(arg1)));
                    if (!bGuid)
                    {
                        sim_printf("Error: '%s' is not a GUID or a known peer\n", arg1);
                        return SCPE_ARG;
                    }
                    strcpy(lastPeer, arg1);     // Peer name not found, assume arg1 is a peerID then...
                }
            }
#endif
            zstr_sendx (actor, "WHISPER", arg2, NULL);
            break;
            
        case ipcShoutRx:    // when we receive a broadcast message
            //sim_debug (DBG_VERBOSE, &ipc_dev, "%s: %s\n", arg1, arg2);
            if (ipc_verbose)
              ipc_printf("(RX SHOUT)   %s/%s:<%s>\n", arg1, arg2, arg3);
            break;

        case ipcWhisperRx:  // when we receive a peer-to-peer (whisper) message
            //sim_debug (DBG_VERBOSE, &ipc_dev, "%s: %s\n", arg1, arg2);
            if (ipc_verbose)
              ipc_printf("(RX WHISPER) %s/%s:<%s>\n", arg1, arg2, arg3);
            if (strncmp (arg1, "fnp-", 4) == 0)
              diaCommand (arg1, arg2, arg3);
            else if (strncmp (arg1, "scp", 3) == 0)
              scpCommand (arg1, arg2, arg3);
            else
              ipc_printf ("dropping whisper from unknown source %s/%s:<%s>\n",
                          arg1, arg2, arg3);
            break;
            
        case ipcTest:
            zyre_test(true);
            break;
            
        default:
            break;
    }
    return SCPE_OK;
}
示例#7
0
void mtt::FileTransfer::connectionClosed(PeerCommunication* p, int code)
{
	LOG_APPEND("closed " << p->getAddressName());
	removePeer(p);
}
示例#8
0
void mtt::FileTransfer::evalCurrentPeers()
{
	const uint32_t peersEvalInterval = 5;

	if (peersEvalCounter-- > 0)
		return;

	peersEvalCounter = peersEvalInterval;

	std::vector<PeerCommunication*> removePeers;
	{
		std::lock_guard<std::mutex> guard(peersMutex);

		if ((uint32_t)activePeers.size() < mtt::config::external.maxTorrentConnections)
			return;

		const uint32_t minPeersTimeChance = 10;
		uint32_t currentTime = (uint32_t)std::time(0);
		auto minTimeToEval = currentTime - minPeersTimeChance;

		const uint32_t minPeersPiecesTimeChance = 20;
		auto minTimeToReceive = currentTime - minPeersPiecesTimeChance;

		uint32_t slowestSpeed = -1;
		PeerCommunication* slowestPeer;

		uint32_t maxUploads = 5;
		std::vector<ActivePeer*> currentUploads;

		for (auto peer : activePeers)
		{
			if (peer.connectionTime > minTimeToEval)
				continue;

			if (peer.lastActivityTime < minTimeToReceive)
			{
				removePeers.push_back(peer.comm);
				continue;
			}

			if (peer.comm->state.peerInterested)
			{
				currentUploads.push_back(&peer);
			}

			if (peer.downloadSpeed < slowestSpeed)
			{
				slowestSpeed = peer.downloadSpeed;
				slowestPeer = peer.comm;
			}
		}

		if (removePeers.empty())
			removePeers.push_back(slowestPeer);

		if (!currentUploads.empty())
		{
			std::sort(currentUploads.begin(), currentUploads.end(), [](const auto & l, const auto & r) { return l->uploadSpeed > r->uploadSpeed; });
			currentUploads.resize(std::min((uint32_t)currentUploads.size(), maxUploads));

			for (auto p : currentUploads)
			{
				auto it = std::find(removePeers.begin(), removePeers.end(), p->comm);
				if (it != removePeers.end())
					removePeers.erase(it);
			}
		}
	}

	for (auto p : removePeers)
	{
		removePeer(p);
	}
}
示例#9
0
static void* data_thread(void *vptr) {
  struct tree_t* tree = vptr;
  struct data_pack dpack;
  FILE* fp = fopen (media_file, "rb");
  struct alpha_queue *socks;
  socks = alpha_queue_new();

  if (NULL == fp) {
    print_error ("error opening media file");
    return NULL;
  }

  dpack.seqnum = 1;
  for (;;) {
    size_t amount = fread (dpack.data, 1, EU_PACKETLEN - sizeof (uint64_t), fp);
    if (0 == amount) {
      print_error ("end of file..?");
      return NULL;
    }

    while (0 == countRootChildren(tree)) {
      sleep(1);		// Temporary to allow setup for tests
      // do nothing.
    }

    uint64_t i;
    for (i = 0; i < countRootChildren(tree); i++) {
      struct peer_info *pi = getRootChild (tree, i);
      if (NULL == pi)
        break;

      struct eu_socket *sock = alpha_queue_pop (socks);
      if (NULL == sock) {
        sock = eu_socket (EU_PUSH);
        if (NULL == sock) {
          print_error ("no more easy socks?");
          return NULL;
        }
      }

      if (eu_connect (sock, pi->addr, pi->port)) {
        print_error ("couldn't connect??");
        return NULL;
      }
      
      int rc = eu_send (sock, &dpack, amount + sizeof (uint64_t), 0);
      if (rc != (amount + sizeof (uint64_t))) {
        if (rc == -2)
        {
          int prremove = removePeer (tree, pi->pid);
          
          if (prremove != 0) {
              switch (prremove) {
                case -1:
                  print_error ("Memory Error in removing peer\n");
                  break;
              }
          }
          printTree (tree);
        }
        
        print_error ("couldn't send full packet :/");
        return NULL;
      }
      
      alpha_queue_push (socks, sock);
      
      usleep(200);
    }

    dpack.seqnum++;
  }
}
示例#10
0
static void* control_thread(void *vptr) {
  struct tree_t* tree = vptr;
  void* sock = getSocket(tree);

  while (1) {
    message_struct* msg = NULL;
    msg = sn_rcvmsg(sock);

    if (msg != NULL) {

      switch (msg->type) {
        case REQ_MOVE:
          print_error ("Request move from %s\n", msg->node_params.pid);
          ;int prmve = movePeer(tree, msg->node_params.pid);
          if (prmve != 0) {
            switch (prmve) {
              case -1:
                print_error ("Memory Error in moving peer\n");
                break;
              case -2:
                print_error ("Peer Not Found in Tree in moving peer\n");
                break;
              case -3:
                print_error ("No Empty Slots in moving peer\n");
                break;
            }
          }
          printTree (tree);
          break;

        case REQ_JOIN:
          print_error ("Request join from %s\n", msg->node_params.pid);
          ;int pradd = addPeer (tree, msg->node_params.peerbw,
                                msg->node_params.pid, msg->node_params.addr,
                                msg->node_params.port);
          if (pradd != 0) {
              switch (pradd) {
                case -1:
                  print_error ("Memory Error in adding peer\n");
                  break;
                case -2:
                  print_error ("No Empty Slots in adding peer\n");
                  break;
              }
          }
          printTree (tree);
          break;
        
        case REM_NODE:
          print_error ("Request drop node %s\n", msg->node_params.pid);
          ;int prremove = removePeer (tree, msg->node_params.pid);
          
          if (pradd != 0) {
              switch (pradd) {
                case -1:
                  print_error ("Memory Error in adding peer\n");
                  break;
              }
          }
          printTree (tree);
          break;

        case REQ_EXIT:
          print_error ("Request exit from %s\n", msg->node_params.pid);
          ;int prrmv = removePeer (tree, msg->node_params.pid);
          if (prrmv == -1) {
            print_error ("Memory Error in remove peer\n");
          }
          printTree (tree);
      }
    }
  }

  return NULL;
}