Пример #1
0
void CUDTSocketListner::Process()
{
	for(;;) // repeat untill all pending connections are accepted
	{
		/*timeval tv;
		tv.tv_sec = 0;
		tv.tv_usec = 0;
		UDT::UDSET readfds;
		UD_ZERO(&readfds);
		UD_SET(m_Server, &readfds);
		int res	= UDT::select(0, &readfds, NULL, NULL, &tv);
		if (!((res != UDT::ERROR) && (UD_ISSET(m_Server, &readfds))))
			break;*/
		
		sockaddr_in6 sa; // sockaddr_in is smaller
		int sa_len = sizeof(sa); 
		UDTSOCKET Client = UDT::accept(m_Server, (sockaddr*)&sa, &sa_len);
		if (UDT::INVALID_SOCK == Client)
		{
			LogLine(LOG_ERROR, L"accept: %S", UDT::getlasterror().getErrorMessage());
			break;
		}
		else if(Client == NULL)
			break;
		
		ConfigSocket(Client);

		uint64_t SendKey = 0;
		int KeySize = sizeof(SendKey);
		UDT::getsockopt(Client, 0, UDT_SENDKEY, &SendKey, &KeySize);

		CSafeAddress Address((sockaddr*)&sa, sa_len, sa_len == sizeof(sockaddr_in) ? CSafeAddress::eUDT_IP4 : CSafeAddress::eUDT_IP6);
		Address.SetPassKey(SendKey);
		GetParent<CSmartSocket>()->AddSessions(Address, new CUDTSocketSession(this, Client, Address));
	}

	const uint64 Size = 0xFFFF;
	char Buffer[Size];
	for(;;) // repeat untill all data is read
	{
		sockaddr_in6 sa; // sockaddr_in is smaller
		int sa_len = sizeof(sa); 
		uint64_t RecvKey = 0;
		int Recived = UDT::recvfrom(m_Server, Buffer, Size, (sockaddr*)&sa, &sa_len, &RecvKey);
		if (UDT::ERROR == Recived)
		{
			LogLine(LOG_ERROR, L"recvfrom: %S", UDT::getlasterror().getErrorMessage());
			break;
		}
		else if(Recived == 0)
			break; // nothing more to be recived
		CBuffer Packet(Buffer, Recived, true);

		CSafeAddress Address((sockaddr*)&sa, sa_len, sa_len == sizeof(sockaddr_in) ? CSafeAddress::eUDT_IP4 : CSafeAddress::eUDT_IP6);
		Address.SetPassKey(RecvKey);
		ReceiveFrom(Packet, Address);
	}
}
Пример #2
0
int32
BNetEndpoint::ReceiveFrom(BNetBuffer& buffer, size_t length,
	BNetAddress& address, int flags)
{
	BNetBuffer chunk(length);
	ssize_t bytesReceived = ReceiveFrom(chunk.Data(), length, address, flags);
	if (bytesReceived > 0)
		buffer.AppendData(chunk.Data(), bytesReceived);
	return bytesReceived;
}
void CUdpSocket::OnReceive(int nErrorCode) 
{
	CString sIP, sMsg;
	UINT nPort;
	char buf[100];
	ZeroMemory(buf, 100);
	ReceiveFrom(buf, 100, sIP, nPort);
	sMsg.Format(_T("%s (%d):%s"), sIP, nPort, buf);
	AfxMessageBox(sMsg);

	CAsyncSocket::OnReceive(nErrorCode);
}
Пример #4
0
int CSocket::ReceiveFrom(void* lpBuf, int nBufLen, string& rSocketAddress, UINT& rSocketPort, int nFlags)
{
	SOCKADDR_IN sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));

	int nResult = ReceiveFrom(lpBuf, nBufLen, &sockAddr, nFlags);
	if(nResult != SOCKET_ERROR)
	{
		rSocketPort = ntohs(sockAddr.sin_port);
		rSocketAddress = inet_ntoa(sockAddr.sin_addr);
	}
	return nResult;
}
Пример #5
0
void CMySocket::OnReceive(int nErrorCode)
{
	char buf[256];
	CString ip;
	UINT port;
	ReceiveFrom(buf,256,ip,port);
	CMFCSockDlg* p = (CMFCSockDlg*)m_CWnd;

	CStringA as = buf;
	p->m_RecordList.AddString( CA2W(as) );

	CAsyncSocket::OnReceive(nErrorCode);
}
void CSocketInterfaceDataRev::OnReceive(int nErrorCode)
{
	// TODO: 在此添加专用代码和/或调用基类
	int iCount = ReceiveFrom(m_oFrameInterface.m_pFrameData, 65536, m_strIPSource, m_uiPortSource);
	if(iCount > 0)
	{
		// 帧字节数
		m_iFrameSize = iCount;
		// 解析帧头
		m_oFrameInterface.ParseFrameHead();
		// 处理内部网络命令帧
		CMainFrame* pMainFrame = NULL;
		pMainFrame = (CMainFrame*)AfxGetMainWnd();		
		pMainFrame->OnProcInterFaceCommand(&m_oFrameInterface);
	}

	CSocket::OnReceive(nErrorCode);
}
Пример #7
0
void CUdpMessager::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	MsgStruct msgStruct;

	memset(&msgStruct, 0, sizeof(msgStruct));

/* (1) */
// 	SOCKADDR_IN romoteAddr;
// 	
// 	memset(&romoteAddr, 0, sizeof(romoteAddr));
// 	romoteAddr.sin_port = htons(5050);
// 	romoteAddr.sin_family = AF_INET;
// 	romoteAddr.sin_addr.S_un.S_addr = inet_addr(ipStr);
// 
// 	int len = sizeof(romoteAddr);
 
// 	if (ReceiveFrom(buf, sizeof(buf), (SOCKADDR *)&romoteAddr, &len) <= 0)
// 	{
// 		AfxMessageBox("接收数据出错!");
// 		
// 	}
// 	else {
// 		buf[len] = '\0';
// 		AfxMessageBox(buf);
// 	}

	/* (2) */
	CString ipString;
	UINT port = 0;
	ReceiveFrom(&msgStruct, sizeof(msgStruct), ipString, port);

	if (NULL != PparentWnd)
	{
		((CGobangDlg *)PparentWnd)->handleNetMsg(&msgStruct, sizeof(msgStruct), ipString, port);
	}
// 		CString msg;
// 		msg.Format("接收:%s:%d %s", ipStr,port, buf);
// 		AfxMessageBox(msg);
	

	CSocket::OnReceive(nErrorCode);
}
void CMulticastSocket::OnReceive(int nErrorCode)
{
	int nError = ReceiveFrom (m_strBuffer, 32000, m_strSendersIP, m_nSendersPort);
	if(nError == SOCKET_ERROR)
		AfxMessageBox("Error receiving data from the host group");
	else
	{
		if (!bForceNoLoopback || (bForceNoLoopback && !(m_strSendersIP == m_strLocalIP && m_nSendersPort == m_nLocalPort)))
		{
			// 1. If loopbackback is not to be forced then interface handles the loopback itself
			// 2. If you have to loopback and SOCKOPT LOOPBACK fails, no problem, interfaces loopback by default
			// 3. If you have to stop loopback and SOCKOPT LOOPBACK fails, ignore messages coming from your own sending socket

			// TODO : Add your code for here. The packet received is in m_strBuffer
		}
	}

	CAsyncSocket::OnReceive(nErrorCode); 
}
Пример #9
0
void CClientSocket::OnReceive(int nErrorCode) 
{
	char buff[DataBufLength];
	int nRead;
	CString sIP;
	UINT nPort;
	
	nRead = ReceiveFrom(buff,DataBufLength,sIP,nPort);
	
	if (nRead != SOCKET_ERROR && nRead != 0 )
	{	
		if(StrNSame(buff,m_szResponseMsg,nRead-4,m_szrLength))
		{				
			DWORD Index=*((DWORD*)(buff+nRead-4));				
			if(Index<=CheckBufLength)
			{		
				m_arBuf[Index]=1;				
				return;
			}
		}		
		
		CData* pData=new CData;
		
		StrNCopy(pData->szBuf,buff,nRead);			
		pData->num=nRead;
		pData->nPort=nPort;
		pData->tarIP=inet_addr(sIP);
		
		if(pData->LoadFromBuf())
		{			
			StrNCopy(m_szResponseMsg+m_szrLength,(char*)&pData->This,sizeof(DWORD));
			SendTo(m_szResponseMsg,m_szrLength+sizeof(DWORD),nPort,sIP);
			if(pData->wIndex>=0&&pData->wIndex<RecvWndNumber&&m_apRecvWnd[pData->wIndex]!=NULL)
			{
				m_apRecvWnd[pData->wIndex]->PostMessage(WM_RECIEVE_MSG,(WPARAM)pData,0);
			}
			TRACE2("Recv a Data index: %d This: %d\n",pData->index,pData->This);
		}
	}	
}
Пример #10
0
int CSocket::ReceiveFrom(void* lpBuf, int nBufLen, SOCKADDR_IN* lpSockInAddr, int nFlags)
{
	socklen_t nSockAddrLen = sizeof(SOCKADDR_IN);
	return ReceiveFrom( lpBuf, nBufLen, (SOCKADDR*)lpSockInAddr, &nSockAddrLen, nFlags );
}
Пример #11
0
void CGnuLocal::OnReceive(int nErrorCode) 
{
	byte buffer[1024];

	CString Host, LocalHost, NetworkPing, NetworkPong;
	CString LanName, IRCAddr, InfoURL;

	UINT    Port, LocalPort, Leaves = 0;

	int buffLength = ReceiveFrom(buffer, 1024, Host, Port);

	GetSockName(LocalHost, LocalPort);

	// Handle Errors
	if(!buffLength || buffLength == SOCKET_ERROR)
		return;
	
	CString strBuffer((char*) buffer, 128);

	NetworkPing =  theApp.m_spGD->ModeNetwork;
	NetworkPing += _T(" PING\r\n");

	NetworkPong =  theApp.m_spGD->ModeNetwork;
	NetworkPong += _T(" PONG\r\n");


	// Handle Ping over LAN
	if(strBuffer.Find(NetworkPing) == 0)
	{
		if(Host == LocalHost)
		{
			return;
		}

		// Send back pong only if not a leaf
		if(!m_pComm->m_LeafModeActive)
		{
			NetworkPong += _T("Port: ") + DWrdtoStr(m_pComm->m_CurrentPort) + _T("\r\n");

			if(theApp.m_spGD->m_NetworkModel == NETWORK_PRIVATE)
			{
				// LAN header
				if(theApp.m_spGD->m_Lan)
					NetworkPong += _T("LAN: ") + theApp.m_spGD->m_LanName + _T("\r\n");

				// IRC header
				if(theApp.m_spGD->m_InternalIRC)
					NetworkPong += _T("IRC: ") + theApp.m_spGD->m_InternalIRCAddr + _T("\r\n");
			}

			// Leaves header
			if(m_pComm->m_NodeCapability == CLIENT_ULTRAPEER)
			{
				int Leaves = m_pComm->CountLeafConnects();

				if(Leaves)
					NetworkPong += _T("Leaves: ") + DWrdtoStr(Leaves) + _T("\r\n");
			}


			NetworkPong += _T("\r\n");

			int pos = strBuffer.Find(_T("\r\nPort: "));
			if(pos != -1)
			{
				pos += 2;
				_stscanf((TCHAR*)buffer + pos, _T("Port: %d\r\n"), &Port);
			}
			
			SendTo(NetworkPong, NetworkPong.GetLength(), UDP_PORT, Host);
		}
	}

	// Extract Data from ping/pong
	if(strBuffer.Find(NetworkPing) == 0 || strBuffer.Find(NetworkPong) == 0)
	{
		int pos, backpos;

		pos = strBuffer.Find(_T("\r\nPort: "));
		if(pos != -1)
		{
			pos += 2;
			_stscanf((TCHAR*)buffer + pos, _T("Port: %d\r\n"), &Port);
		}

		pos = strBuffer.Find(_T("\r\nLAN: "));
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find(_T("\r\n"), pos);
			LanName = strBuffer.Mid(pos + 5, backpos - pos - 5);
		}

		pos = strBuffer.Find(_T("\r\nIRC: "));
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find(_T("\r\n"), pos);
			IRCAddr = strBuffer.Mid(pos + 5, backpos - pos - 5);
		}

		pos = strBuffer.Find(_T("\r\nInfoURL: "));
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find(_T("\r\n"), pos);
			InfoURL = strBuffer.Mid(pos + 9, backpos - pos - 9);
		}

		pos = strBuffer.Find(_T("\r\nLeaves: "));
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find(_T("\r\n"), pos);
			Leaves  = _ttoi( strBuffer.Mid(pos + 8, backpos - pos - 8) );
		}
	}

	
	// Handle Pong over LAN
	if(strBuffer.Find(NetworkPong) == 0)
	{
		CString Extra;

		if(Leaves)
			Extra = _T(" with ") + DWrdtoStr(Leaves) + _T(" leaves");
	}

	for(int i = 0; i < m_HostList.size(); i++)
		if( m_HostList[i].Host == Host && m_HostList[i].Port == Port)
			return;


	LanNode LocalNode;
	LocalNode.Host		= Host;
	LocalNode.Port		= Port;
	LocalNode.Name		= LanName;
	LocalNode.IRCserver = IRCAddr;
	LocalNode.InfoPage	= InfoURL;
	LocalNode.Leaves	= Leaves;
	m_HostList.push_back(LocalNode);

	CAsyncSocket::OnReceive(nErrorCode);
}
Пример #12
0
void CUTPSocketListner::Recv(const byte* Buffer, size_t uSize, const struct sockaddr* sa, socklen_t sa_len)
{
	byte* pBuffer = (byte*)Buffer;
	size_t uPos = 0;

	if(uSize < 8)
		return;

	uint32 Rand;
	memcpy(&Rand, pBuffer, sizeof(uint32));						uPos += 4;

	CryptoPP::Weak1::MD5 md5;
	md5.Update((byte*)&Rand, sizeof(uint32));
	md5.Update((byte*)&m_RecvKey, sizeof(uint64));
	byte Hash[16];
	md5.Final(Hash);

//#ifdef _DEBUG
//	LogLine(LOG_INFO | LOG_DEBUG, L"Recv from %s PassKey %I64u -> %s", 
//		CSafeAddress(sa, sa_len, sa_len == sizeof(sockaddr_in) ? CSafeAddress::eUTP_IP4 : CSafeAddress::eUTP_IP6).ToString().c_str(),
//		m_RecvKey, ToHex(Hash, 16).c_str());
//#endif

	CryptoPP::Weak::ARC4::Encryption RC4;
	RC4.SetKey(Hash, 16);
	RC4.DiscardBytes(256);

	RC4.ProcessData(pBuffer + 4, pBuffer + 4, 4);
	UHdr Hdr;
	memcpy(&Hdr.Bits, pBuffer + uPos, 4);						uPos += 4;

	if(Hdr.Fields.Discard)
		RC4.DiscardBytes(Hdr.Fields.Discard * 256);

	RC4.ProcessData(pBuffer + uPos, pBuffer + uPos, uSize - uPos);

	uint64 PassKey = 0;
	if(Hdr.Fields.HasKey)
	{
		if(uSize - uPos < 8)
			return;
		memcpy(&PassKey, pBuffer + uPos, sizeof(uint64));		uPos += 8;
	}

	if(uSize - uPos < Hdr.Fields.PadLen)
		return;
	uSize -= Hdr.Fields.PadLen;
	
	if(Hdr.Fields.Reserved != 0) // if we want to use the reserverd bits we must set the magic value
	{
		if(memcmp(pBuffer + uSize, NEO_MAGIC, 4) != 0)
			return;
	}

	TKeyMap::iterator I = m_SendKeys.find((struct sockaddr*)sa);
	if(I == m_SendKeys.end())
	{
		if(PassKey == 0)
			return; // drop this packet as wen cant answer it

		SPassKey* pSendKey = new SPassKey((struct sockaddr*)sa);
		I = m_SendKeys.insert(TKeyMap::value_type(pSendKey->sa, pSendKey)).first;
	}
	if(PassKey != 0)
		I->second->PassKey = PassKey;
	//I->second->bAck = true; // if we got a packet it means that the other site knows out passkey and those we dont have to send it
	I->second->LastActivity = GetCurTick();


	switch(Hdr.Fields.Type)
	{
	case 0:
		{
			CBuffer Packet(pBuffer + uPos, uSize - uPos, true);
			CSafeAddress Address((sockaddr*)sa, sa_len, sa_len == sizeof(sockaddr_in) ? CSafeAddress::eUTP_IP4 : CSafeAddress::eUTP_IP6);
			Address.SetPassKey(I->second->PassKey);
			ReceiveFrom(Packet, Address);
			break;
		}
	case 1:
		// Lookup the right UTP socket that can handle this message
		UTP_IsIncomingUTP(&got_incoming_connection, &send_to, this, pBuffer + uPos, uSize - uPos, (const struct sockaddr*)sa, sa_len, &utp_overhead_2);
		break;
	case 15:
		{
			if(m_RecvKey < I->second->PassKey) // we have to decide who does the Sync, we do that in a trivial way
				Send(NULL, 0, sa, sa_len, 15);
			else
			{
				CSafeAddress Address(sa, sa_len, sa_len == sizeof(sockaddr_in) ? CSafeAddress::eUTP_IP4 : CSafeAddress::eUTP_IP6);
				Address.SetPassKey(I->second->PassKey);
				CSmartSocket* pSocket = GetParent<CSmartSocket>();
				CUTPSocketSession* pSession = pSocket->NewChannel(Address)->Cast<CUTPSocketSession>();
				if(pSession && !pSession->IsValid())
					pSession->Connect(sa, sa_len);
			}
			break;
		}
	}
}
Пример #13
0
void CClientUDPSocket::OnReceive(int nErrorCode)
{
	if (nErrorCode)
	{
		if (thePrefs.GetVerbose())
			DebugLogError(_T("Error: Client UDP socket, error on receive event: %s"), GetErrorMessage(nErrorCode, 1));
	}

	BYTE buffer[5000];
	SOCKADDR_IN sockAddr = {0};
	int iSockAddrLen = sizeof sockAddr;
	int length = ReceiveFrom(buffer, sizeof buffer, (SOCKADDR*)&sockAddr, &iSockAddrLen);
	if (length >= 1 && !(theApp.ipfilter->IsFiltered(sockAddr.sin_addr.S_un.S_addr) || theApp.clientlist->IsBannedClient(sockAddr.sin_addr.S_un.S_addr)))
    {
		CString strError;
		try
		{
			switch (buffer[0])
			{
				case OP_EMULEPROT:
				{
					if (length >= 2)
						ProcessPacket(buffer+2, length-2, buffer[1], sockAddr.sin_addr.S_un.S_addr, ntohs(sockAddr.sin_port));
					else
						throw CString(_T("eMule packet too short"));
					break;
				}
				case OP_KADEMLIAPACKEDPROT:
				{
					theStats.AddDownDataOverheadKad(length);
					if (length >= 2)
					{
						uint32 nNewSize = length*10+300;
						byte* unpack = new byte[nNewSize];
						uLongf unpackedsize = nNewSize-2;
						int iZLibResult = uncompress(unpack+2, &unpackedsize, buffer+2, length-2);
						if (iZLibResult == Z_OK)
						{
							unpack[0] = OP_KADEMLIAHEADER;
							unpack[1] = buffer[1];
							try
							{
								Kademlia::CKademlia::processPacket(unpack, unpackedsize+2, ntohl(sockAddr.sin_addr.S_un.S_addr), ntohs(sockAddr.sin_port));
							}
							catch(...)
							{
								delete[] unpack;
								throw;
							}
						}
						else
						{
							delete[] unpack;
							CString strError;
							strError.Format(_T("Failed to uncompress Kad packet: zip error: %d (%hs)"), iZLibResult, zError(iZLibResult));
							throw strError;
						}
						delete[] unpack;
					}
					else
						throw CString(_T("Kad packet (compressed) too short"));
					break;
				}
				case OP_KADEMLIAHEADER:
				{
					theStats.AddDownDataOverheadKad(length);
					if (length >= 2)
						Kademlia::CKademlia::processPacket(buffer, length, ntohl(sockAddr.sin_addr.S_un.S_addr), ntohs(sockAddr.sin_port));
					else
						throw CString(_T("Kad packet too short"));
					break;
				}
				default:
				{
					CString strError;
					strError.Format(_T("Unknown protocol 0x%02x"), buffer[0]);
					throw strError;
				}
			}
		}
		catch(CFileException* error)
		{
			error->Delete();
			strError = _T("Invalid packet received");
		}
		catch(CMemoryException* error)
		{
			error->Delete();
			strError = _T("Memory exception");
		}
		catch(CString error)
		{
			strError = error;
		}
		catch(Kademlia::CIOException* error)
		{
			error->Delete();
			strError = _T("Invalid packet received");
		}
		catch(CException* error)
		{
			error->Delete();
			strError = _T("General packet error");
		}
		catch(...)
		{
			strError = _T("Unknown exception");
			ASSERT(0);
		}

		if (thePrefs.GetVerbose() && !strError.IsEmpty())
		{
			CString strClientInfo;
			CUpDownClient* client;
			if (buffer[0] == OP_EMULEPROT)
				client = theApp.clientlist->FindClientByIP_UDP(sockAddr.sin_addr.S_un.S_addr, ntohs(sockAddr.sin_port));
			else
				client = theApp.clientlist->FindClientByIP_KadPort(sockAddr.sin_addr.S_un.S_addr, ntohs(sockAddr.sin_port));
			if (client)
				strClientInfo = client->DbgGetClientInfo();
			else
				strClientInfo.Format(_T("%s:%u"), ipstr(sockAddr.sin_addr), ntohs(sockAddr.sin_port));

			DebugLogWarning(_T("Client UDP socket: prot=0x%02x  opcode=0x%02x  size=%u  %s: %s"), buffer[0], buffer[1], length, strError, strClientInfo);
		}
    }
	else if (length == SOCKET_ERROR)
	{
		DWORD dwError = WSAGetLastError();
		if (dwError == WSAECONNRESET)
		{
			// Depending on local and remote OS and depending on used local (remote?) router we may receive
			// WSAECONNRESET errors. According some KB articles, this is a special way of winsock to report 
			// that a sent UDP packet was not received by the remote host because it was not listening on 
			// the specified port -> no eMule running there.
			//
			// TODO: So, actually we should do something with this information and drop the related Kad node 
			// or eMule client...
			;
		}
		if (thePrefs.GetVerbose() && dwError != WSAECONNRESET)
		{
			CString strClientInfo;
			if (iSockAddrLen > 0 && sockAddr.sin_addr.S_un.S_addr != 0 && sockAddr.sin_addr.S_un.S_addr != INADDR_NONE)
				strClientInfo.Format(_T(" from %s:%u"), ipstr(sockAddr.sin_addr), ntohs(sockAddr.sin_port));
			DebugLogError(_T("Error: Client UDP socket, failed to receive data%s: %s"), strClientInfo, GetErrorMessage(dwError, 1));
		}
	}
}
Пример #14
0
void CGnuLocal::OnReceive(int nErrorCode) 
{
	byte buffer[1024];

	CString Host, LocalHost, NetworkPing, NetworkPong;
	CString LanName, IRCAddr, InfoURL;

	UINT    Port, LocalPort, Leaves = 0;

	int buffLength = ReceiveFrom(buffer, 1024, Host, Port);

	GetSockName(LocalHost, LocalPort);

	// Handle Errors
	if(!buffLength || buffLength == SOCKET_ERROR)
		return;
	
	CString strBuffer((char*) buffer, 128);

	NetworkPing =  m_pComm->m_NetworkName;
	NetworkPing += " PING\r\n";

	NetworkPong =  m_pComm->m_NetworkName;
	NetworkPong += " PONG\r\n";


	// Handle Ping over LAN
	if(strBuffer.Find(NetworkPing) == 0)
	{
		if(Host == LocalHost)
		{
			m_pCore->LogError("UDP: Ping received from localhost");
			//return;
		}

		// Send back pong only if not a leaf
		NetworkPong += "Port: " + NumtoStr(m_pNet->m_CurrentPort) + "\r\n";

		if(m_pPrefs->m_LanMode)
		{
			NetworkPong += "LAN: " + m_pPrefs->m_LanName + "\r\n";

			CString RandCache = m_pComm->m_pCache->GetRandWebCache(true);
		
			if(!RandCache.IsEmpty())
				NetworkPing += "WebCache: " + RandCache + "\r\n";
		}

		// Leaves header
		if(m_pComm->m_GnuClientMode ==GNU_ULTRAPEER)
		{
			int Leaves = m_pComm->CountLeafConnects();

			if(Leaves)
				NetworkPong += "Leaves: " + NumtoStr(Leaves) + "\r\n";
		}


		NetworkPong += "\r\n";

		int pos = strBuffer.Find("\r\nPort: ");
		if(pos != -1)
		{
			pos += 2;
			sscanf((char*)buffer + pos, "Port: %d\r\n", &Port);
		}
		
		SendTo(NetworkPong, NetworkPong.GetLength(), UDP_PORT, Host);
		m_pCore->LogError("UDP: Pong Sent to " + Host + ":" + NumtoStr(Port));
	
	}

	// Extract Data from ping/pong
	if(strBuffer.Find(NetworkPing) == 0 || strBuffer.Find(NetworkPong) == 0)
	{
		int pos, backpos;

		pos = strBuffer.Find("\r\nPort: ");
		if(pos != -1)
		{
			pos += 2;
			sscanf((char*)buffer + pos, "Port: %d\r\n", &Port);
		}

		pos = strBuffer.Find("\r\nLAN: ");
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find("\r\n", pos);
			LanName = strBuffer.Mid(pos + 5, backpos - pos - 5);
		}

		pos = strBuffer.Find("\r\nWebCache: ");
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find("\r\n", pos);
			CString NewWebCache = strBuffer.Mid(pos + 10, backpos - pos - 10);

			m_pComm->m_pCache->WebCacheAddCache(NewWebCache);
		}

		pos = strBuffer.Find("\r\nIRC: ");
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find("\r\n", pos);
			IRCAddr = strBuffer.Mid(pos + 5, backpos - pos - 5);
		}

		pos = strBuffer.Find("\r\nInfoURL: ");
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find("\r\n", pos);
			InfoURL = strBuffer.Mid(pos + 9, backpos - pos - 9);
		}

		pos = strBuffer.Find("\r\nLeaves: ");
		if(pos != -1)
		{
			pos += 2;
			backpos = strBuffer.Find("\r\n", pos);
			Leaves  = atoi( strBuffer.Mid(pos + 8, backpos - pos - 8) );
		}
	}

	
	// Handle Pong over LAN
	if(strBuffer.Find(NetworkPong) == 0)
	{
		CString Extra;

		if(Leaves)
			Extra = " with " + NumtoStr(Leaves) + " leaves";

		m_pCore->LogError("UDP: Pong Received from " + Host + ":" + NumtoStr(Port) + Extra);
	}


	std::map<int, LanNode>::iterator itNode;
	for(itNode = m_LanNodeIDMap.begin(); itNode != m_LanNodeIDMap.end(); itNode++)
		if( itNode->second.Host == Host && itNode->second.Port == Port)
			return;


	LanNode LocalNode;
	LocalNode.Host		= Host;
	LocalNode.Port		= Port;
	LocalNode.Name		= LanName;
	LocalNode.IRCserver = IRCAddr;
	LocalNode.InfoPage	= InfoURL;
	LocalNode.Leaves	= Leaves;

	int LanNodeID = m_NextLanID++;
	m_LanNodeIDMap[LanNodeID] = LocalNode;


	// If we're not in lan mode, just add to cache
	if(!m_pPrefs->m_LanMode)
	{
		Node PermNode;
		PermNode.Host = Host;
		PermNode.Port = Port;
		
		if(PermNode.Host != LocalHost)
			m_pComm->m_pCache->m_GnuPerm.push_back(PermNode);
	}


	CAsyncSocket::OnReceive(nErrorCode);
}
Пример #15
0
// We receive message from other application
//
void CConnexionSocket::OnReceive(int nErrorCode) 
{
	CString IP;
	UINT	Port;

	DWORD DataToRead;
	if( IOCtl( FIONREAD, &DataToRead )!=0 )
	{
		// Read data in the buffer
		if( m_BufferReceive )
		{
			char* BufferTemp = (char*) malloc( m_BufferReceiveSize+DataToRead );
			memcpy( BufferTemp, m_BufferReceive, m_BufferReceiveSize );
			free( m_BufferReceive );
			m_BufferReceive = BufferTemp;
		}
		else
		{
			m_BufferReceive = (char*) malloc( DataToRead );
			m_BufferReceiveSize = 0;
		}

		ReceiveFrom( &m_BufferReceive[m_BufferReceiveSize], DataToRead, IP, Port );
		m_BufferReceiveSize += DataToRead;

		// If we have the type and len of the message
		while( m_BufferReceiveSize>=sizeof(short)+sizeof(int) )
		{
			// Verify that the message is complete
			int Len;
			memcpy( &Len, &m_BufferReceive[sizeof(short)], sizeof(Len) );
			short Id;
			memcpy( &Id, m_BufferReceive, sizeof(Id) );

			//CString Str;
			//Str.Format( _T("Recu message. Taille attendu : %i / Taille recue : %i"), Len+6, m_BufferReceiveSize );
			//AfxMessageBox( Str );

			if( m_BufferReceiveSize>=(int) (Len+sizeof(short)+sizeof(int)) )
			{
				// Save the message in a file for debug
				{
					//CString Str, Str2;
					//Str.Format( _T("Message %i (len=%i) : "), (int) Id, Len );
					//for( int i=0; i<(int) (Len+sizeof(short)+sizeof(int)); i++ )
					//{
					//	Str2.Format( _T("%02x "), m_BufferReceive[i] );
					//	Str += Str2;
					//}
					//Str += _T("\n");
					//CStdioFile f(_T("c:\\tracelima.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText | CFile::shareDenyWrite );
					//f.SeekToEnd();
					//f.WriteString(Str);				
					//f.Close();
				}
				ReadAMessage( IP, Port );
			}
			else
				break;
		}
	}

	// Call the base class
	CSocket::OnReceive(nErrorCode);
}
Пример #16
0
void CWin32Socket::ServiceL(TWin32Message& aMessage)
	{
	switch (aMessage.OppCode())
		{
		case EConnect:
			{
			Connect(aMessage);
			break;
			}
		case ECancelConnect:
			{
			if (iConnectMessage)
				{
				Complete(iConnectMessage, KErrCancel);
				}
			break;
			}
		case ESend:
			{
			Send(aMessage);
			break;
			}
		case ECancelSend:
			{
			if (iSendMessage)
				{
				Complete(iSendMessage, KErrCancel);
				}
			break;
			}
		case ESendTo:
			{
			SendTo(aMessage);
			break;
			}
		case ECancelSendTo:
			{
			if (iSendMessage)
				{
				Complete(iSendMessage, KErrCancel);
				}
			break;
			}
		case EReceive:
			{
			Receive(aMessage);
			break;
			}
		case ECancelReceive:
			{
			if (iReceiveMessage)
				{
				Complete(iReceiveMessage, KErrCancel);
				}
			break;
			}
		case EReceiveFrom:
			{
			ReceiveFrom(aMessage);
			break;
			}
		case ECancelReceiveFrom:
			{
			if (iReceiveMessage)
				{
				Complete(iReceiveMessage, KErrCancel);
				}
			break;
			}
		case EGetSocketName:
			{
			GetSocketName(aMessage);
			break;
			}
		case EBind:
			{
			Bind(aMessage);
			break;
			}
		case EGetPeerName:
			{
			GetPeerName(aMessage);
			break;
			}
		case EListen:
			{
			Listen(aMessage);
			break;
			}
		case EAccept:
			{
			Accept(aMessage);
			break;
			}
		case ECancelAccept:
			{
			if (iAcceptMessage)
				{
				Complete(iAcceptMessage, KErrCancel);
				}
			break;
			}
		case EGetOption:
			{
			GetOption(aMessage);
			break;
			}
		case ESetOption:
			{
			SetOption(aMessage);
			break;
			}
		default:
			{
			__ASSERT_DEBUG(EFalse, Panic(EWinSockPrtInvalidSocketOppCode));
			}
		}
	}