📄 listensocket.cpp
字号:
SendPacket(replypacket, true);
client->CheckFailedFileIdReqs((uchar*)packet);
break;
}
}
// check to see if this is a new file they are asking for
if (md4cmp(client->GetUploadFileID(), packet) != 0)
client->SetCommentDirty();
client->SetUploadFileID(reqfile);
// send filestatus
CSafeMemFile data(16+16);
data.WriteHash16(reqfile->GetFileHash());
if (reqfile->IsPartFile())
((CPartFile*)reqfile)->WritePartStatus(&data);
else
data.WriteUInt16(0);
Packet* packet = new Packet(&data);
packet->opcode = OP_FILESTATUS;
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__FileStatus", client, (char*)reqfile->GetFileHash());
theStats.AddUpDataOverheadFileRequest(packet->size);
SendPacket(packet, true);
break;
}
throw GetResString(IDS_ERR_WRONGPACKAGESIZE);
break;
}
case OP_FILEREQANSNOFIL:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_FileReqAnsNoFil", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
if (size == 16)
{
// if that client does not have my file maybe has another different
CPartFile* reqfile = theApp.downloadqueue->GetFileByID((uchar*)packet);
if (!reqfile){
client->CheckFailedFileIdReqs((uchar*)packet);
break;
}
// we try to swap to another file ignoring no needed parts files
switch (client->GetDownloadState())
{
case DS_CONNECTED:
case DS_ONQUEUE:
case DS_NONEEDEDPARTS:
client->DontSwapTo(client->reqfile); // ZZ:DownloadManager
if (!client->SwapToAnotherFile(_T("Source says it doesn't have the file. CClientReqSocket::ProcessPacket()"), true, true, true, NULL, false, false)) { // ZZ:DownloadManager
theApp.downloadqueue->RemoveSource(client);
}
break;
}
break;
}
throw GetResString(IDS_ERR_WRONGPACKAGESIZE);
break;
}
case OP_REQFILENAMEANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_FileReqAnswer", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
CSafeMemFile data((BYTE*)packet,size);
uchar cfilehash[16];
data.ReadHash16(cfilehash);
CPartFile* file = theApp.downloadqueue->GetFileByID(cfilehash);
if (file == NULL)
client->CheckFailedFileIdReqs(cfilehash);
client->ProcessFileInfo(&data, file);
break;
}
case OP_FILESTATUS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_FileStatus", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
CSafeMemFile data((BYTE*)packet,size);
uchar cfilehash[16];
data.ReadHash16(cfilehash);
CPartFile* file = theApp.downloadqueue->GetFileByID(cfilehash);
if (file == NULL)
client->CheckFailedFileIdReqs(cfilehash);
client->ProcessFileStatus(false, &data, file);
break;
}
case OP_STARTUPLOADREQ:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_StartUpLoadReq", client);
theStats.AddDownDataOverheadFileRequest(size);
if (!client->CheckHandshakeFinished(OP_EDONKEYPROT, opcode))
break;
if (size == 16)
{
CKnownFile* reqfile = theApp.sharedfiles->GetFileByID((uchar*)packet);
if (reqfile)
{
if (md4cmp(client->GetUploadFileID(), packet) != 0)
client->SetCommentDirty();
client->SetUploadFileID(reqfile);
client->SendCommentInfo(reqfile);
theApp.uploadqueue->AddClientToQueue(client);
}
else
client->CheckFailedFileIdReqs((uchar*)packet);
}
break;
}
case OP_QUEUERANK:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_QueueRank", client);
theStats.AddDownDataOverheadFileRequest(size);
client->ProcessEdonkeyQueueRank(packet, size);
break;
}
case OP_ACCEPTUPLOADREQ:
{
if (thePrefs.GetDebugClientTCPLevel() > 0){
DebugRecv("OP_AcceptUploadReq", client, size >= 16 ? packet : NULL);
if (size > 0)
Debug(_T(" ***NOTE: Packet contains %u additional bytes\n"), size);
Debug(_T(" QR=%d\n"), client->IsRemoteQueueFull() ? (UINT)-1 : (UINT)client->GetRemoteQueueRank());
}
theStats.AddDownDataOverheadFileRequest(size);
client->ProcessAcceptUpload();
break;
}
case OP_REQUESTPARTS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_RequestParts", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
CSafeMemFile data((BYTE*)packet,size);
uchar reqfilehash[16];
data.ReadHash16(reqfilehash);
uint32 auStartOffsets[3];
auStartOffsets[0] = data.ReadUInt32();
auStartOffsets[1] = data.ReadUInt32();
auStartOffsets[2] = data.ReadUInt32();
uint32 auEndOffsets[3];
auEndOffsets[0] = data.ReadUInt32();
auEndOffsets[1] = data.ReadUInt32();
auEndOffsets[2] = data.ReadUInt32();
if (thePrefs.GetDebugClientTCPLevel() > 0){
Debug(_T(" Start1=%u End1=%u Size=%u\n"), auStartOffsets[0], auEndOffsets[0], auEndOffsets[0] - auStartOffsets[0]);
Debug(_T(" Start2=%u End2=%u Size=%u\n"), auStartOffsets[1], auEndOffsets[1], auEndOffsets[1] - auStartOffsets[1]);
Debug(_T(" Start3=%u End3=%u Size=%u\n"), auStartOffsets[2], auEndOffsets[2], auEndOffsets[2] - auStartOffsets[2]);
}
for (int i = 0; i < ARRSIZE(auStartOffsets); i++)
{
if (auEndOffsets[i] > auStartOffsets[i])
{
Requested_Block_Struct* reqblock = new Requested_Block_Struct;
reqblock->StartOffset = auStartOffsets[i];
reqblock->EndOffset = auEndOffsets[i];
md4cpy(reqblock->FileID, reqfilehash);
reqblock->transferred = 0;
client->AddReqBlock(reqblock);
}
else
{
if (thePrefs.GetVerbose())
{
if (auEndOffsets[i] != 0 || auStartOffsets[i] != 0)
AddDebugLogLine(false, _T("Client requests invalid %u. file block %u-%u (%d bytes): %s"), i, auStartOffsets[i], auEndOffsets[i], auEndOffsets[i] - auStartOffsets[i], client->DbgGetClientInfo());
}
}
}
break;
}
case OP_CANCELTRANSFER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_CancelTransfer", client);
theStats.AddDownDataOverheadFileRequest(size);
if (theApp.uploadqueue->RemoveFromUploadQueue(client, _T("Remote client canceled transfer."))){
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_LOW, false, _T("%s: Upload session ended due to canceled transfer."), client->GetUserName());
}
break;
}
case OP_END_OF_DOWNLOAD:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_EndOfDownload", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
if (size>=16 && !md4cmp(client->GetUploadFileID(),packet))
{
if (theApp.uploadqueue->RemoveFromUploadQueue(client, _T("Remote client ended transfer."))){
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(false, DLP_LOW, "%s: Upload session ended due to ended transfer.", client->GetUserName());
}
}
else
client->CheckFailedFileIdReqs((uchar*)packet);
break;
}
case OP_HASHSETREQUEST:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_HashSetReq", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
// IP banned, no answer for this request
if (client->IsBanned()){
client->CheckFailedFileIdReqs(NULL);
break;
}
if (size != 16)
throw GetResString(IDS_ERR_WRONGHPACKAGESIZE);
client->SendHashsetPacket(packet);
break;
}
case OP_HASHSETANSWER:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_HashSetAnswer", client, packet);
theStats.AddDownDataOverheadFileRequest(size);
client->ProcessHashSet(packet,size);
break;
}
case OP_SENDINGPART:
{
if (thePrefs.GetDebugClientTCPLevel() > 1)
DebugRecv("OP_SendingPart", client, packet);
theStats.AddDownDataOverheadFileRequest(24);
if (client->reqfile && !client->reqfile->IsStopped() && (client->reqfile->GetStatus()==PS_READY || client->reqfile->GetStatus()==PS_EMPTY))
{
client->ProcessBlockPacket(packet,size);
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_OUTOFPARTREQS:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_OutOfPartReqs", client);
theStats.AddDownDataOverheadFileRequest(size);
if (client->GetDownloadState() == DS_DOWNLOADING)
{
client->SetDownloadState(DS_ONQUEUE);
}
break;
}
case OP_CHANGE_CLIENT_ID:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_ChangedClientID", client);
theStats.AddDownDataOverheadOther(size);
CSafeMemFile data((BYTE*)packet, size);
uint32 nNewUserID = data.ReadUInt32();
uint32 nNewServerIP = data.ReadUInt32();
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T(" NewUserID=%u (%08x, %s) NewServerIP=%u (%08x, %s)\n"), nNewUserID, nNewUserID, ipstr(nNewUserID), nNewServerIP, nNewServerIP, ipstr(nNewServerIP));
if (IsLowID(nNewUserID))
{ // client changed server and has a LowID
CServer* pNewServer = theApp.serverlist->GetServerByIP(nNewServerIP);
if (pNewServer != NULL)
{
client->SetUserIDHybrid(nNewUserID); // update UserID only if we know the server
client->SetServerIP(nNewServerIP);
client->SetServerPort(pNewServer->GetPort());
}
}
else if (nNewUserID == client->GetIP())
{ // client changed server and has a HighID(IP)
client->SetUserIDHybrid(ntohl(nNewUserID));
CServer* pNewServer = theApp.serverlist->GetServerByIP(nNewServerIP);
if (pNewServer != NULL)
{
client->SetServerIP(nNewServerIP);
client->SetServerPort(pNewServer->GetPort());
}
}
else{
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: OP_ChangedClientID unknown contents\n"));
}
UINT uAddData = data.GetLength() - data.GetPosition();
if (uAddData > 0){
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T("***NOTE: OP_ChangedClientID contains add. data %s\n"), GetHexDump((uint8*)packet + data.GetPosition(), uAddData));
}
break;
}
case OP_CHANGE_SLOT:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_ChangeSlot", client, size>=16 ? packet : NULL);
theStats.AddDownDataOverheadOther(size);
// sometimes sent by Hybrid
break;
}
case OP_MESSAGE:
{
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_Message", client);
theStats.AddDownDataOverheadOther(size);
if (size < 2)
throw CString(_T("invalid message packet"));
uint16 length = *((uint16*)packet);
if ((UINT)(length+2) != size)
throw CString(_T("invalid message packet"));
//filter me?
if ( (thePrefs.MsgOnlyFriends() && !client->IsFriend()) || (thePrefs.MsgOnlySecure() && client->GetUserName()==NULL) )
{
if (!client->GetMessageFiltered()){
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("Filtered Message from '%s' (IP:%s)"), client->GetUserName(), ipstr(client->GetConnectIP()));
}
client->SetMessageFiltered(true);
break;
}
if (length > MAX_CLIENT_MSG_LEN){
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Message from '%s' (IP:%s) exceeds limit by %u chars, truncated."), client->GetUserName(), ipstr(client->GetConnectIP()), length - MAX_CLIENT_MSG_LEN);
length = MAX_CLIENT_MSG_LEN;
}
AddLogLine(true,GetResString(IDS_NEWMSG), client->GetUserName(), ipstr(client->GetConnectIP()));
char* message = new char[length+1];
memcpy(message,packet+2,length);
message[length] = '\0';
if (thePrefs.GetDebugClientTCPLevel() > 0)
Debug(_T(" %hs\n"), message);
theApp.emuledlg->chatwnd->chatselector.ProcessMessage(client,message);
delete[] message;
break;
}
case OP_ASKSHAREDFILES:
{ // client wants to know what we have in share, let's see if we allow him to know that
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugRecv("OP_AskSharedFiles", client);
theStats.AddDownDataOverheadOther(size);
// IP banned, no answer for this request
if (client->IsBanned())
break;
CPtrList list;
if (thePrefs.CanSeeShares()==vsfaEverybody || (thePrefs.CanSeeShares()==vsfaFriends && client->IsFriend()))
{
CCKey bufKey;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -