📄 serversocket.cpp
字号:
Debug(_T("*** NOTE: OP_ServerStatus: ***AddData: %u bytes\n"), size - 8);
DebugHexDump((uint8*)packet + 8, size - 8);
}
}
break;
}
case OP_SERVERIDENT:{
// OP_SERVERIDENT - this is sent by the server only if we send a OP_GETSERVERLIST
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("ServerMsg - OP_ServerIdent\n"));
if (size<16+4+2+4){
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_KNOWNSERVERINFOREC));
break;// throw "Invalid server info received";
}
CServer* pServer = cur_server ? theApp.serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()) : NULL;
CString strInfo;
CSafeMemFile data((BYTE*)packet, size);
uint8 aucHash[16];
data.ReadHash16(aucHash);
if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T("Hash=%s (%s)"), md4str(aucHash), DbgGetHashTypeString(aucHash));
uint32 nServerIP = data.ReadUInt32();
uint16 nServerPort = data.ReadUInt16();
if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T(" IP=%s:%u"), ipstr(nServerIP), nServerPort);
UINT nTags = data.ReadUInt32();
if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T(" Tags=%u"), nTags);
CString strName;
CString strDescription;
for (UINT i = 0; i < nTags; i++){
CTag tag(&data, pServer ? pServer->GetUnicodeSupport() : false);
if (tag.GetNameID() == ST_SERVERNAME){
if (tag.IsStr()){
strName = tag.GetStr();
if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T(" Name=%s"), strName);
}
}
else if (tag.GetNameID() == ST_DESCRIPTION){
if (tag.IsStr()){
strDescription = tag.GetStr();
if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T(" Desc=%s"), strDescription);
}
}
else if (thePrefs.GetDebugServerTCPLevel() > 0)
strInfo.AppendFormat(_T(" ***UnkTag: 0x%02x=%u"), tag.GetNameID(), tag.GetInt());
}
if (thePrefs.GetDebugServerTCPLevel() > 0){
strInfo += _T('\n');
Debug(_T("%s"), strInfo);
UINT uAddData = data.GetLength() - data.GetPosition();
if (uAddData > 0){
Debug(_T("*** NOTE: OP_ServerIdent: ***AddData: %u bytes\n"), uAddData);
DebugHexDump((uint8*)packet + data.GetPosition(), uAddData);
}
}
if (pServer){
pServer->SetListName(strName);
pServer->SetDescription(strDescription);
if (((uint32*)aucHash)[0] == 0x2A2A2A2A){
const CString& rstrVersion = pServer->GetVersion();
if (!rstrVersion.IsEmpty())
pServer->SetVersion(_T("eFarm ") + rstrVersion);
else
pServer->SetVersion(_T("eFarm"));
}
theApp.emuledlg->ShowConnectionState();
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(pServer);
theApp.emuledlg->serverwnd->UpdateMyInfo();
}
break;
}
// tecxx 1609 2002 - add server's serverlist to own serverlist
case OP_SERVERLIST:{
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("ServerMsg - OP_ServerList\n"));
try{
CSafeMemFile servers((BYTE*)packet,size);
UINT count = servers.ReadUInt8();
// check if packet is valid
if (1 + count*(4+2) > size)
count = 0;
int addcount = 0;
while(count)
{
uint32 ip = servers.ReadUInt32();
uint16 port = servers.ReadUInt16();
CServer* srv = new CServer(port, ipstr(ip));
srv->SetListName(srv->GetFullIP());
if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(srv, true))
delete srv;
else
addcount++;
count--;
}
if (addcount)
AddLogLine(false,GetResString(IDS_NEWSERVERS), addcount);
if (thePrefs.GetDebugServerTCPLevel() > 0){
UINT uAddData = servers.GetLength() - servers.GetPosition();
if (uAddData > 0){
Debug(_T("*** NOTE: OP_ServerList: ***AddData: %u bytes\n"), uAddData);
DebugHexDump((uint8*)packet + servers.GetPosition(), uAddData);
}
}
}
catch(CFileException* error){
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_BADSERVERLISTRECEIVED));
error->Delete();
}
break;
}
case OP_CALLBACKREQUESTED:{
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("ServerMsg - OP_CallbackRequested\n"));
if (size == 6)
{
uint32 dwIP = PeekUInt32(packet);
if (theApp.ipfilter->IsFiltered(dwIP)){
theStats.filteredclients++;
if (thePrefs.GetLogFilteredIPs())
AddDebugLogLine(false, _T("Ignored callback request (IP=%s) - IP filter (%s)"), ipstr(dwIP), theApp.ipfilter->GetLastHit());
break;
}
if (theApp.clientlist->IsBannedClient(dwIP)){
if (thePrefs.GetLogBannedClients()){
CUpDownClient* pClient = theApp.clientlist->FindClientByIP(dwIP);
AddDebugLogLine(false, _T("Ignored callback request from banned client %s; %s"), ipstr(dwIP), pClient->DbgGetClientInfo());
}
break;
}
uint16 nPort = PeekUInt16(packet+4);
CUpDownClient* client = theApp.clientlist->FindClientByIP(dwIP,nPort);
if (client)
client->TryToConnect();
else
{
client = new CUpDownClient(0,nPort,dwIP,0,0,true);
theApp.clientlist->AddClient(client);
client->TryToConnect();
}
}
break;
}
case OP_CALLBACK_FAIL:{
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("ServerMsg - OP_Callback_Fail %s\n"), DbgGetHexDump((uint8*)packet, size));
break;
}
case OP_REJECT:{
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("ServerMsg - OP_Reject %s\n"), DbgGetHexDump((uint8*)packet, size));
// this could happen if we send a command with the wrong protocol (e.g. sending a compressed packet to
// a server which does not support that protocol).
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Server rejected last command"));
break;
}
default:
if (thePrefs.GetDebugServerTCPLevel() > 0)
Debug(_T("***NOTE: ServerMsg - Unknown message; opcode=0x%02x %s\n"), opcode, DbgGetHexDump((uint8*)packet, size));
;
}
return true;
}
catch(CFileException* error)
{
if (thePrefs.GetVerbose())
{
TCHAR szError[MAX_CFEXP_ERRORMSG];
error->m_strFileName = _T("server packet");
error->GetErrorMessage(szError, ARRSIZE(szError));
AddDebugLogLine(false,GetResString(IDS_ERR_PACKAGEHANDLING),szError);
}
error->Delete();
ASSERT(0);
if (opcode==OP_SEARCHRESULT || opcode==OP_FOUNDSOURCES)
return true;
}
catch(CMemoryException* error)
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_PACKAGEHANDLING),_T("CMemoryException"));
error->Delete();
ASSERT(0);
if (opcode==OP_SEARCHRESULT || opcode==OP_FOUNDSOURCES)
return true;
}
catch(CString error)
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_PACKAGEHANDLING),error.GetBuffer());
ASSERT(0);
}
catch(...)
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_PACKAGEHANDLING),_T("Unknown exception"));
ASSERT(0);
}
SetConnectionState(CS_DISCONNECTED);
return false;
}
void CServerSocket::ConnectToServer(CServer* server){
if (cur_server){
ASSERT(0);
delete cur_server;
cur_server = NULL;
}
cur_server = new CServer(server);
AddLogLine(false,GetResString(IDS_CONNECTINGTO),cur_server->GetListName(),cur_server->GetFullIP(),cur_server->GetPort());
if (thePrefs.IsProxyASCWOP() )
{
if (thePrefs.GetProxy().UseProxy == true)
{
thePrefs.SetProxyASCWOP(true);
thePrefs.SetUseProxy(false);
AddLogLine(false,GetResString(IDS_ASCWOP_PROXYSUPPORT)+GetResString(IDS_DISABLED));
}
else
thePrefs.SetProxyASCWOP(false);
}
SetConnectionState(CS_CONNECTING);
if (!this->Connect(server->GetAddress(),server->GetPort())){
int error = this->GetLastError();
if ( error != WSAEWOULDBLOCK){
AddLogLine(false,GetResString(IDS_ERR_CONNECTIONERROR),cur_server->GetListName(),cur_server->GetFullIP(),cur_server->GetPort(), GetErrorMessage(error, 1));
SetConnectionState(CS_FATALERROR);
return;
}
}
SetConnectionState(CS_CONNECTING);
}
void CServerSocket::OnError(int nErrorCode)
{
SetConnectionState(CS_DISCONNECTED);
if (thePrefs.GetVerbose())
AddDebugLogLine(false,GetResString(IDS_ERR_SOCKET),cur_server->GetListName(),cur_server->GetFullIP(),cur_server->GetPort(), GetErrorMessage(nErrorCode, 1));
}
bool CServerSocket::PacketReceived(Packet* packet)
{
try
{
theStats.AddDownDataOverheadServer(packet->size);
if (packet->prot == OP_PACKEDPROT)
{
uint32 uComprSize = packet->size;
if (!packet->UnPackPacket(250000)){
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("Failed to decompress server TCP packet: protocol=0x%02x opcode=0x%02x size=%u"), packet ? packet->prot : 0, packet ? packet->opcode : 0, packet ? packet->size : 0);
return true;
}
packet->prot = OP_EDONKEYPROT;
if (thePrefs.GetDebugServerTCPLevel() > 1)
Debug(_T("Received compressed server TCP packet; opcode=0x%02x size=%u uncompr size=%u\n"), packet->opcode, uComprSize, packet->size);
}
if (packet->prot == OP_EDONKEYPROT)
{
ProcessPacket(packet->pBuffer,packet->size,packet->opcode);
}
else
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("Received server TCP packet with unknown protocol: protocol=0x%02x opcode=0x%02x size=%u"), packet ? packet->prot : 0, packet ? packet->opcode : 0, packet ? packet->size : 0);
}
}
catch(...)
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("Error: Unhandled exception while processing server TCP packet: protocol=0x%02x opcode=0x%02x size=%u"), packet ? packet->prot : 0, packet ? packet->opcode : 0, packet ? packet->size : 0);
ASSERT(0);
return false;
}
return true;
}
void CServerSocket::OnClose(int nErrorCode){
CEMSocket::OnClose(0);
if (connectionstate == CS_WAITFORLOGIN){
SetConnectionState(CS_SERVERFULL);
}
else if (connectionstate == CS_CONNECTED){
SetConnectionState(CS_DISCONNECTED);
}
else{
SetConnectionState(CS_NOTCONNECTED);
}
serverconnect->DestroySocket(this);
}
void CServerSocket::SetConnectionState(sint8 newstate){
connectionstate = newstate;
if (newstate < 1){
serverconnect->ConnectionFailed(this);
}
else if (newstate == CS_CONNECTED || newstate == CS_WAITFORLOGIN){
if (serverconnect)
serverconnect->ConnectionEstablished(this);
}
}
void CServerSocket::SendPacket(Packet* packet, bool delpacket, bool controlpacket, uint32 actualPayloadSize){
m_dwLastTransmission = GetTickCount();
CEMSocket::SendPacket(packet, delpacket, controlpacket, actualPayloadSize);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -