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; }
nuiSocket::~nuiSocket() { DelSocket(this); Close(); }