📄 listensocket.cpp
字号:
catch(CMemoryException* error)
{
error->Delete();
throw CString(_T("Memory exception"));
}
}
catch(CClientException* ex) // nearly same as the 'CString' exception but with optional deleting of the client
{
if (thePrefs.GetVerbose() && !ex->m_strMsg.IsEmpty())
DebugLogWarning(_T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), ex->m_strMsg, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
if (client && ex->m_bDelete)
client->SetDownloadState(DS_ERROR, _T("Error while processing eDonkey packet (CClientException): ") + ex->m_strMsg);
Disconnect(ex->m_strMsg);
ex->Delete();
return false;
}
catch(CString error)
{
if (thePrefs.GetVerbose() && !error.IsEmpty()){
if (opcode == OP_REQUESTFILENAME /*low priority for OP_REQUESTFILENAME*/)
DebugLogWarning(_T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), error, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
else
DebugLogWarning(_T("%s - while processing eDonkey packet: opcode=%s size=%u; %s"), error, DbgGetDonkeyClientTCPOpcode(opcode), size, DbgGetClientInfo());
}
if (client)
client->SetDownloadState(DS_ERROR, _T("Error while processing eDonkey packet (CString exception): ") + error);
Disconnect(_T("Error when processing packet.") + error);
return false;
}
return true;
}
bool CClientReqSocket::ProcessExtPacket(char* packet, uint32 size, UINT opcode, UINT uRawSize)
{
try
{
try
{
if (!client && opcode!=OP_PORTTEST)
{
theStats.AddDownDataOverheadOther(uRawSize);
throw GetResString(IDS_ERR_UNKNOWNCLIENTACTION);
}
if (thePrefs.m_iDbgHeap >= 2 && opcode!=OP_PORTTEST)
ASSERT_VALID(client);
switch(opcode)
{
case OP_MULTIPACKET:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MultiPacket", client, packet);
theStats.AddDownDataOverheadFileRequest(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
CSafeMemFile data_in((BYTE*)packet,size);
uchar reqfilehash[16];
data_in.ReadHash16(reqfilehash);
CKnownFile* reqfile;
if ( (reqfile = theApp.sharedfiles->GetFileByID(reqfilehash)) == NULL ){
if ( !((reqfile = theApp.downloadqueue->GetFileByID(reqfilehash)) != NULL
&& reqfile->GetFileSize() > PARTSIZE ) )
{
// send file request no such file packet (0x48)
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__FileReqAnsNoFil", client, packet);
Packet* replypacket = new Packet(OP_FILEREQANSNOFIL, 16);
md4cpy(replypacket->pBuffer, packet);
theStats.AddUpDataOverheadFileRequest(replypacket->size);
SendPacket(replypacket, true);
client->CheckFailedFileIdReqs(reqfilehash);
break;
}
}
if (!client->GetWaitStartTime())
client->SetWaitStartTime();
// if we are downloading this file, this could be a new source
// no passive adding of files with only one part
if (reqfile->IsPartFile() && reqfile->GetFileSize() > PARTSIZE)
{
if (thePrefs.GetMaxSourcePerFile() > ((CPartFile*)reqfile)->GetSourceCount())
theApp.downloadqueue->CheckAndAddKnownSource((CPartFile*)reqfile, client, true);
}
// check to see if this is a new file they are asking for
if (md4cmp(client->GetUploadFileID(), reqfilehash) != 0)
client->SetCommentDirty();
client->SetUploadFileID(reqfile);
uint8 opcode_in;
CSafeMemFile data_out(128);
data_out.WriteHash16(reqfile->GetFileHash());
while(data_in.GetLength()-data_in.GetPosition())
{
opcode_in = data_in.ReadUInt8();
switch(opcode_in)
{
case OP_REQUESTFILENAME:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPReqFileName", client, packet);
client->ProcessExtendedInfo(&data_in, reqfile);
data_out.WriteUInt8(OP_REQFILENAMEANSWER);
data_out.WriteString(reqfile->GetFileName(), client->GetUnicodeSupport());
break;
}
case OP_AICHFILEHASHREQ:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPAichFileHashReq", client, packet);
if (client->IsSupportingAICH() && reqfile->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE
&& reqfile->GetAICHHashset()->HasValidMasterHash())
{
data_out.WriteUInt8(OP_AICHFILEHASHANS);
reqfile->GetAICHHashset()->GetMasterHash().Write(&data_out);
}
break;
}
case OP_SETREQFILEID:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPSetReqFileID", client, packet);
data_out.WriteUInt8(OP_FILESTATUS);
if (reqfile->IsPartFile())
((CPartFile*)reqfile)->WritePartStatus(&data_out);
else
data_out.WriteUInt16(0);
break;
}
//We still send the source packet seperately..
//We could send it within this packet.. If agreeded, I will fix it..
case OP_REQUESTSOURCES:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPReqSources", client, packet);
if (thePrefs.GetDebugSourceExchange())
AddDebugLogLine(false, _T("SXRecv: Client source request; %s, File=\"%s\""), client->DbgGetClientInfo(), reqfile->GetFileName());
//Although this shouldn't happen, it's a just in case to any Mods that mess with version numbers.
if (client->GetSourceExchangeVersion() > 1)
{
//data_out.WriteUInt8(OP_ANSWERSOURCES);
DWORD dwTimePassed = ::GetTickCount() - client->GetLastSrcReqTime() + CONNECTION_LATENCY;
bool bNeverAskedBefore = client->GetLastSrcReqTime() == 0;
if(
//if not complete and file is rare
( reqfile->IsPartFile()
&& (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS)
&& ((CPartFile*)reqfile)->GetSourceCount() <= RARE_FILE
) ||
//OR if file is not rare or if file is complete
( (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS * MINCOMMONPENALTY) )
)
{
client->SetLastSrcReqTime();
Packet* tosend = reqfile->CreateSrcInfoPacket(client);
if(tosend)
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AnswerSources", client, (char*)reqfile->GetFileHash());
theStats.AddUpDataOverheadSourceExchange(tosend->size);
SendPacket(tosend, true);
}
}
// else
// {
// if (thePrefs.GetVerbose())
// AddDebugLogLine(false, _T("RCV: Source Request to fast. (This is testing the new timers to see how much older client will not receive this)"));
// }
}
break;
}
default:
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: Invalid sub opcode 0x%02x with OP_MultiPacket received; %s"), opcode_in, client->DbgGetClientInfo());
}
}
if( data_out.GetLength() > 16 )
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__MultiPacketAns", client, (char*)reqfile->GetFileHash());
Packet* reply = new Packet(&data_out, OP_EMULEPROT);
reply->opcode = OP_MULTIPACKETANSWER;
theStats.AddUpDataOverheadFileRequest(reply->size);
SendPacket(reply, true);
}
break;
}
case OP_MULTIPACKETANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MultiPacketAns", client, packet);
theStats.AddDownDataOverheadFileRequest(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
CSafeMemFile data_in((BYTE*)packet,size);
uchar reqfilehash[16];
data_in.ReadHash16(reqfilehash);
CPartFile* reqfile = theApp.downloadqueue->GetFileByID(reqfilehash);
//Make sure we are downloading this file.
if (reqfile==NULL){
client->CheckFailedFileIdReqs(reqfilehash);
throw GetResString(IDS_ERR_WRONGFILEID) + _T(" (OP_MULTIPACKETANSWER; reqfile==NULL)");
}
if (client->GetRequestFile()==NULL)
throw GetResString(IDS_ERR_WRONGFILEID) + _T(" (OP_MULTIPACKETANSWER; client->GetRequestFile()==NULL)");
if (reqfile != client->GetRequestFile())
throw GetResString(IDS_ERR_WRONGFILEID) + _T(" (OP_MULTIPACKETANSWER; reqfile!=client->GetRequestFile())");
uint8 opcode_in;
while(data_in.GetLength()-data_in.GetPosition())
{
opcode_in = data_in.ReadUInt8();
switch(opcode_in)
{
case OP_REQFILENAMEANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPReqFileNameAns", client, packet);
client->ProcessFileInfo(&data_in, reqfile);
break;
}
case OP_FILESTATUS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPFileStatus", client, packet);
client->ProcessFileStatus(false, &data_in, reqfile);
break;
}
case OP_AICHFILEHASHANS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_MPAichFileHashAns", client);
client->ProcessAICHFileHash(&data_in, reqfile);
break;
}
default:
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: Invalid sub opcode 0x%02x with OP_MultiPacketAns received; %s"), opcode_in, client->DbgGetClientInfo());
}
}
break;
}
case OP_EMULEINFO:
{
theStats.AddDownDataOverheadOther(uRawSize);
client->ProcessMuleInfoPacket(packet,size);
if (thePrefs.GetDebugClientTCPLevel() > 0){
DebugRecv("OP_EmuleInfo", client);
Debug(_T(" %s\n"), client->DbgGetMuleInfo());
}
// start secure identification, if
// - we have received eD2K and eMule info (old eMule)
if (client->GetInfoPacketsReceived() == IP_BOTH)
client->InfoPacketsReceived();
client->SendMuleInfoPacket(true);
break;
}
case OP_EMULEINFOANSWER:
{
theStats.AddDownDataOverheadOther(uRawSize);
client->ProcessMuleInfoPacket(packet,size);
if (thePrefs.GetDebugClientTCPLevel() > 0){
DebugRecv("OP_EmuleInfoAnswer", client);
Debug(_T(" %s\n"), client->DbgGetMuleInfo());
}
// start secure identification, if
// - we have received eD2K and eMule info (old eMule)
if (client->GetInfoPacketsReceived() == IP_BOTH)
client->InfoPacketsReceived();
break;
}
case OP_SECIDENTSTATE:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_SecIdentState", client);
theStats.AddDownDataOverheadOther(uRawSize);
client->ProcessSecIdentStatePacket((uchar*)packet,size);
if (client->GetSecureIdentState() == IS_SIGNATURENEEDED)
client->SendSignaturePacket();
else if (client->GetSecureIdentState() == IS_KEYANDSIGNEEDED)
{
client->SendPublicKeyPacket();
client->SendSignaturePacket();
}
break;
}
case OP_PUBLICKEY:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_PublicKey", client);
theStats.AddDownDataOverheadOther(uRawSize);
client->ProcessPublicKeyPacket((uchar*)packet,size);
break;
}
case OP_SIGNATURE:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_Signature", client);
theStats.AddDownDataOverheadOther(uRawSize);
client->ProcessSignaturePacket((uchar*)packet,size);
break;
}
case OP_COMPRESSEDPART:
{
if (thePrefs.GetDebugClientTCPLevel() > 1)
DebugRecv("OP_CompressedPart", client, packet);
theStats.AddDownDataOverheadFileRequest(24);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
if (client->GetRequestFile() && !client->GetRequestFile()->IsStopped() && (client->GetRequestFile()->GetStatus()==PS_READY || client->GetRequestFile()->GetStatus()==PS_EMPTY))
{
client->ProcessBlockPacket(packet,size,true);
if (client->GetRequestFile()->IsStopped() || client->GetRequestFile()->GetStatus()==PS_PAUSED || client->GetRequestFile()->GetStatus()==PS_ERROR)
{
client->SendCancelTransfer();
client->SetDownloadState(client->GetRequestFile()->IsStopped() ? DS_NONE : DS_ONQUEUE);
}
}
else
{
client->SendCancelTransfer();
client->SetDownloadState((client->GetRequestFile()==NULL || client->GetRequestFile()->IsStopped()) ? DS_NONE : DS_ONQUEUE);
}
break;
}
case OP_QUEUERANKING:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_QueueRanking", client);
theStats.AddDownDataOverheadFileRequest(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
client->ProcessEmuleQueueRank(packet, size);
break;
}
case OP_REQUESTSOURCES:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_RequestSources", client, packet);
theStats.AddDownDataOverheadSourceExchange(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
if (client->GetSourceExchangeVersion() > 1)
{
if(size != 16)
throw GetResString(IDS_ERR_BADSIZE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -