📄 listensocket.cpp
字号:
if (thePrefs.GetMaxSourcePerFile() > ((CPartFile*)reqfile)->GetSourceCount())
theApp.downloadqueue->CheckAndAddKnownSource((CPartFile*)reqfile, client);
}
// 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());
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);
//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());
if (thePrefs.GetDebugSourceExchange())
AddDebugLogLine( false, _T("RCV:Source Request User(%s) File(%s)"), client->GetUserName(), reqfile->GetFileName() );
theStats.AddUpDataOverheadSourceExchange(tosend->size);
SendPacket(tosend, true);
}
}
// else
// {
// if (thePrefs.GetVerbose())
// AddDebugLogLine(false, "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__MulitPacketAns", 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(size);
if (client->IsBanned()){
client->CheckFailedFileIdReqs(NULL);
break;
}
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->reqfile==NULL)
throw GetResString(IDS_ERR_WRONGFILEID) + _T(" (OP_MULTIPACKETANSWER; client->reqfile==NULL)");
if (reqfile != client->reqfile)
throw GetResString(IDS_ERR_WRONGFILEID) + _T(" (OP_MULTIPACKETANSWER; reqfile!=client->reqfile)");
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;
}
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);
if (client->IsBanned())
break;
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->reqfile && !client->reqfile->IsStopped() && (client->reqfile->GetStatus()==PS_READY || client->reqfile->GetStatus()==PS_EMPTY))
{
client->ProcessBlockPacket(packet,size,true);
if (client->reqfile->IsStopped() || client->reqfile->GetStatus()==PS_PAUSED || client->reqfile->GetStatus()==PS_ERROR)
{
client->SendCancelTransfer();
client->SetDownloadState(client->reqfile->IsStopped() ? DS_NONE : DS_ONQUEUE);
}
}
else
{
client->SendCancelTransfer();
client->SetDownloadState((client->reqfile==NULL || client->reqfile->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);
//first check shared file list, then download list
CKnownFile* file;
if ((file = theApp.sharedfiles->GetFileByID((uchar*)packet)) != NULL ||
(file = theApp.downloadqueue->GetFileByID((uchar*)packet)) != NULL)
{
DWORD dwTimePassed = ::GetTickCount() - client->GetLastSrcReqTime() + CONNECTION_LATENCY;
bool bNeverAskedBefore = client->GetLastSrcReqTime() == 0;
if(
//if not complete and file is rare
( file->IsPartFile()
&& (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS)
&& ((CPartFile*)file)->GetSourceCount() <= RARE_FILE
) ||
//OR if file is not rare or if file is complete
( (bNeverAskedBefore || dwTimePassed > SOURCECLIENTREASKS * MINCOMMONPENALTY) )
)
{
client->SetLastSrcReqTime();
Packet* tosend = file->CreateSrcInfoPacket(client);
if(tosend)
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__AnswerSources", client, (char*)file->GetFileHash());
if (thePrefs.GetDebugSourceExchange())
AddDebugLogLine( false, _T("RCV:Source Request User(%s) File(%s)"), client->GetUserName(), file->GetFileName() );
theStats.AddUpDataOverheadSourceExchange(tosend->size);
SendPacket(tosend, true, true);
}
}
}
else
client->CheckFailedFileIdReqs((uchar*)packet);
}
break;
}
case OP_ANSWERSOURCES:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AnswerSources", client, packet);
theStats.AddDownDataOverheadSourceExchange(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
CSafeMemFile data((BYTE*)packet,size);
uchar hash[16];
data.ReadHash16(hash);
CKnownFile* file = theApp.downloadqueue->GetFileByID(hash);
if(file)
{
if (file->IsPartFile())
{
//set the client's answer time
client->SetLastSrcAnswerTime();
//and set the file's last answer time
((CPartFile*)file)->SetLastAnsweredTime();
((CPartFile*)file)->AddClientSources(&data, client->GetSourceExchangeVersion());
}
}
else
client->CheckFailedFileIdReqs(hash);
break;
}
case OP_FILEDESC:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_FileDesc", client);
theStats.AddDownDataOverheadFileRequest(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
client->ProcessMuleCommentPacket(packet,size);
break;
}
case OP_REQUESTPREVIEW:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_RequestPreView", client);
theStats.AddDownDataOverheadOther(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
// IP banned, no answer for this request
if (client->IsBanned())
break;
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
client->ProcessPreviewReq(packet,size);
if (thePrefs.GetVerbose())
AddDebugLogLine(true,_T("Client '%s' (%s) requested Preview - accepted"), client->GetUserName(), ipstr(client->GetConnectIP()));
}
else
{
// we don't send any answer here, because the client should know that he was not allowed to ask
if (thePrefs.GetVerbose())
AddDebugLogLine(true,_T("Client '%s' (%s) requested Preview - denied"), client->GetUserName(), ipstr(client->GetConnectIP()));
}
break;
}
case OP_PREVIEWANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_PreviewAnswer", client);
theStats.AddDownDataOverheadOther(uRawSize);
client->CheckHandshakeFinished(OP_EMULEPROT, opcode);
client->ProcessPreviewAnswer(packet, size);
break;
}
case OP_PEERCACHE_QUERY:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -