Пример #1
0
	int P2P_connection::ProcessMessage(SOCKET sSocket)
	{
		
		int index;
		
		
		Peer *peer= mPeers[sSocket];

		if(peer==NULL) {cout<<"peer=null"; return SOCKET_ERROR;}
		if(!(*peer).bSentHandShake)
		{
			char *in_buffer=new char[68];
			int rett = recv(sSocket,in_buffer, 68, 0);					//receving handshake
			if (rett <MinHandshakeSize)
			{
				DelSocket(sSocket);
				return SOCKET_ERROR;
			}
			if(!HandshakeIsVaryfied(in_buffer))
			{
				DelSocket(sSocket);
				return SOCKET_ERROR;
			}
			cout<<"hand shake is valid";
			peer->bSentHandShake=true;
			return rett;
		}
		
		
		char *in_buffer=new char[4];
		int rett = recv(sSocket,in_buffer, 4, 0);					//receving size
		if (rett< 4)
		{
			DelSocket(sSocket);			
			return SOCKET_ERROR;
		}

		int iMessageSize=read_from_byte<int>(&in_buffer); 
		
		//Keep_alive 
		if(iMessageSize==0)
		{
			cout<<"Keep alive";
			return rett;
		}

		for(int i=0;i<4;i++) in_buffer--;
		delete[]in_buffer;	
		in_buffer=new char[iMessageSize];
		in_buffer=RecvBigData(sSocket,iMessageSize);
		
		char cMessageType=read_from_byte<char>(&in_buffer);
		switch (cMessageType)
		{
			case choke:
				cout<<"ckoke\n";
				peer->bChokingMe=true;
				break;
			case unchoke:
				cout<<"unchoke\n";
				peer->bChokingMe=false;
				break;
			case interested:
				cout<<"interested\n";
				peer->bInterestedInMe=true;
				break;
			case not_interested:
				cout<<"not interested\n";
				peer->bInterestedInMe=false;
				break;
			case have:
				cout<<"have\n";
				index=read_from_byte<int>(&in_buffer);
				if(sizeof(peer->bitfield)>=index/8+1)
					(peer->bitfield[index/8])|=(1<<(index%8));
				break;
			case bitfield:
				cout<<"bitfield\n";
				peer->bSentBitfield=true;
				peer->bitfield=in_buffer;
				break;
			case request:
				cout<<"request\n";

				break;
			case piece:
				cout<<"piece\n";
				break;
			case cancel:
				cout<<"cancel\n";
				break;
			default:
				cout<<"default\n";
				DelSocket(sSocket);
				return SOCKET_ERROR;
				break;
			
		}
		/*for(int i=0;i<iMessageSize;i++) in_buffer--;
		delete[] in_buffer;*/
		return 0;
	}
Пример #2
0
nuiSocket::~nuiSocket()
{
  DelSocket(this);
  Close();
}