⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servercore_loginserver.cpp

📁 魔兽世界的私服源程序
💻 CPP
字号:
#include <winsock2.h>
#include "../Common.h"
#include "ServerCore.h"
#include "../Core.h"
#define Log LoginserverLogMessage

#ifdef _WIN32
#include "../WorldThread.h"
#include "../CallbackHandler.h"
#include "../Handlers/UserManager.h"

struct RealmPacket {
	unsigned short Port;
	char Name[64];
	char IPAddr[16];
	unsigned long nPlayers;

};

#endif

void		ServerCore::InitLoginserver()
{

    mLoginServerAddress.AnyAddress();
    mLoginServerAddress.Service(mcfgLoginserverPort);
    mLoginServerSocket = new wxSocketServer(mLoginServerAddress);

    mLoginServerSocket->SetEventHandler(*this,EVENT_LOGINSERVERSOCKET);
    mLoginServerSocket->SetNotify(wxSOCKET_CONNECTION_FLAG);
    mLoginServerSocket->Notify(true);
    mLoginServerSocket->SetFlags(wxSOCKET_NOWAIT);
}

void        ServerCore::ShutdownLoginserver         ()
{
    if (mLoginServerSocket) mLoginServerSocket->Destroy();
}

void        ServerCore::LoginserverLogMessage       (wxString msg)
{
    LOG(_T("[login] %s"),msg.c_str());
}

void        ServerCore::LoginServerSocketHandler    (wxSocketEvent& event)
{
    if(event.GetSocketEvent() == wxSOCKET_CONNECTION)
    {
        wxSocketBase* socket = mLoginServerSocket->Accept(false);

        wxIPV4address peer;
        socket->GetPeer(peer);

        Log(wxString::Format(_T("new connection from '%s:%i'"),peer.IPAddress().c_str(),peer.Service()));

        wowPacket       worldserver(socket);

        // need this for my router
        if (peer.IPAddress() != _T("127.0.0.1"))
            worldserver.Putcstr0(wxString::Format(_T("%s:%i"), mcfgExtAddress.c_str(), mcfgWorldserverPort));
        else
            worldserver.Putcstr0(wxString::Format(_T("127.0.0.1:%i"), mcfgWorldserverPort));       

        socket->Write(worldserver.GetData(), worldserver.GetSize());
        socket->Destroy();
    }
}

#ifdef _WIN32
long ServerCore::LoginServerAnnounce (void) {
    int ret;

    LPHOSTENT lpHostEntry = gethostbyname(mcfgRealmlist);
    if (!lpHostEntry)
        return mcfgRealmlistUpdate;

	SOCKET RealmAdd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RealmAdd == INVALID_SOCKET) {
        LOG(_T("[Login-RList] Got INVALID_SOCKET, trying again in a bit.. (%d)"), mcfgRealmlistUpdate);
        return mcfgRealmlistUpdate;
    }
    
    SOCKADDR_IN RealmServer;
    RealmServer.sin_family = AF_INET;
    RealmServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
    RealmServer.sin_port = htons(9111);
    
    RealmPacket packet = {0};
    strncpy(packet.IPAddr, mcfgExtAddress.c_str(), 16);
    strncpy(packet.Name, mcfgTitle.c_str(), 64);
    packet.nPlayers = WorldThread::GetThread()->GetUserManager()->GetClientCount();
    packet.Port = mcfgLoginserverPort;

    ret = sendto(RealmAdd, (char *)&packet, sizeof(packet), NULL, (LPSOCKADDR)&RealmServer, sizeof(struct sockaddr));
    if (ret == SOCKET_ERROR) {
        LOG(_T("[Login-RList] Got socket error on sendto, id %d"), WSAGetLastError());
        closesocket(RealmAdd);
        return mcfgRealmlistUpdate; 
    }

    ret = closesocket(RealmAdd);
    if (ret == SOCKET_ERROR) {
        LOG(_T("[Login-RList] Got socket error on closesocket, id %d"), WSAGetLastError());
        return mcfgRealmlistUpdate;
    }

    LOG(_T("[Login-RList] Packet sent to %s - recalling in %d"), mcfgRealmlist, mcfgRealmlistUpdate);
    LOG(_T("[Login-RList] IP: %s Port: %d Players: %d Name: %s"), packet.IPAddr, packet.Port, packet.nPlayers, packet.Name);
    return mcfgRealmlistUpdate;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -