Selam arkadaşlar iyi forumlar.
Oyunda kasma oluyor lag giriyor oyundan düşüyorum gibi şikayet eden oyuncuların oyunun pcyi ne şekilde ne kadar kullandığını görebilmek için güzel bi sistem sizinlede paylaşmak istedim.
RAM Ve CPU MHZ Gibi değerleri tutuyor;
konuya geçelim;
Oyunda kasma oluyor lag giriyor oyundan düşüyorum gibi şikayet eden oyuncuların oyunun pcyi ne şekilde ne kadar kullandığını görebilmek için güzel bi sistem sizinlede paylaşmak istedim.
RAM Ve CPU MHZ Gibi değerleri tutuyor;
konuya geçelim;
Kod:
packet.h açlır HEADER_CG_MARK_LOGIN = 100, aratılır HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99, üstüne eklenir typedef struct command_mark_login aratılır struct sys_info_by_distraught { BYTE header; float RAM; int CPU; }; altına eklenir
Kod:
PythonNetworkStream.h açılır bool SendSpecial(int nLen, void * pvBuf); aratılır bool SendSYSInfo(); önce eklenir
Kod:
PythonNetworkStreamPhaseGame.cpp açılır BOOL gs_bEmpireLanuageEnable = TRUE; aratılır //SYS INFO BY DISTRAUGHT #define _WIN32_WINNT 0x0501 float GetRAM() { MEMORYSTATUSEX memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatusEx(&memstat); return (float)memstat.ullTotalPhys / (1024 * 1024 * 1024); } int GetCPUSpeedMHz() { char Buffer[MAX_PATH]; unsigned long BufSize = MAX_PATH; unsigned long ulMHz = MAX_PATH; HKEY hKey; long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hKey); if (lError != ERROR_SUCCESS) return 0; RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&ulMHz, &BufSize); return ulMHz; } bool CPythonNetworkStream::SendSYSInfo() { std::ifstream check("sentsys.txt"); if (check.good()) { int i = 0; check >> i; if (i > 0) return false; } check.close(); sys_info_by_distraught packet; packet.header = HEADER_CG_SYS_INFO_BY_DISTRAUGHT; packet.RAM = GetRAM(); packet.CPU = GetCPUSpeedMHz(); if (!Send(sizeof(packet), &packet)) return false; std::ofstream save("sentsys.txt"); save << "1"; save.close(); return SendSequence(); } //SYS INFO END eklenir
Kod:
PythonNetworkStreamPhaseLogin.cpp açılır SendLoginPacket fonksiyonun icinde; bunu arat if (!Send(sizeof(LoginPacket), &LoginPacket)) üstüne ekle SendSYSInfo(); client tarafı bitti şimdi server tarafına gecelim.
Kod:
packet.h açılır HEADER_CG_REFINE = 96, aratılır altına eklenir HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99, typedef struct SPacketGGSetup aratılır struct sys_info_by_distraught { BYTE header; float RAM; int CPU; }; üstüne eklenir
Kod:
packet_info.cpp açılır Set(HEADER_CG_TEXT, sizeof(TPacketCGText), "Text", false); aratılır üstüne eklenir Set(HEADER_CG_SYS_INFO_BY_DISTRAUGHT, sizeof(sys_info_by_distraught), "SYSInfo", true);
Kod:
input.h açılır CInputLogin class içersinde aratılır virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData); altına eklenir void SaveSYSInfo(const char* data);
Kod:
input_login.cpp açılır case HEADER_CG_PONG: aratılır üstüne eklenir case HEADER_CG_SYS_INFO_BY_DISTRAUGHT: SaveSYSInfo(c_pData); int CInputLogin::Analyze(LPDESC d, BYTE bHeader, const char * c_pData) arat üstüne ekle void CInputLogin::SaveSYSInfo(const char* data) { sys_info_by_distraught* packet = (sys_info_by_distraught*)data; DBManager::instance().Query("INSERT INTO system_info(ram, cpu, sent_at) VALUES (%f, %d, CURDATE());", packet->RAM, packet->CPU); return; } server tarafıda bitti break;
Kod:
navicat/player Run query yapsın bunu DROP TABLE IF EXISTS `system_info`; CREATE TABLE `system_info` ( `ram` float(12,0) DEFAULT NULL, `cpu` int(12) DEFAULT NULL, `sent_at` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Sistem bilgisini navicat/player / system_info tablosunda bulabilirsiniz. Oyuncuların RAM'lerini ve CPU'larını tekrar göndermelerini isterseniz, sadece bir 0'ın içeriği olan bir sentsys.txt dosyasını istemcinin ana dizinine yama sunucunuza yükleyin.
Metin2 Sunucu Geliştirme Serisi: C++ ile Oyuncu İşletim Sistemi Loglama Sistemi
Giriş
Metin2 özel sunucu (private server) geliştirme sürecinde, oyuncuların cihazlarında çalışan işletim sistemlerini takip etmek ve analiz etmek, hem güvenlik hem de performans açısından büyük önem taşır. Özellikle C++ tabanlı game core ve auth server yapıları üzerinde çalışan geliştiriciler için, oyuncuların Windows, Linux veya macOS gibi sistemlerden bağlandığını belirlemek, potansiyel saldırı risklerini önceden kestirmeye yardımcı olabilir. Bu yazıda, C++ kullanarak oyuncu bağlantılarında işletim sistemi bilgisini loglayan bir sistem nasıl geliştirilir, detaylıca ele alacağız.
Oyuncu Bağlantısı ve Veri Toplama
Metin2 sunucusuna bir oyuncu bağlandığında, client tarafından belirli başlangıç paketleri gönderilir. Bu paketlerden biri, istemcinin çalıştığı ortam hakkında bilgi içerebilir. Eğer doğrudan sistem bilgisi gönderilmiyorsa, bu veri client src tarafında genişletilerek gönderilebilir. Örneğin, client/src/UserInterface/Locale_inc.h dosyasında tanımlanan platform bilgileri sunucuya aktarılabilir.
Sunucu Tarafında C++ ile İşletim Sistemi Tanıma
Sunucu tarafında, game server ile gelen bağlantılar yakalanır. Oyuncu kimliği doğrulandıktan sonra, auth server ile yapılan ilk handshake sırasında, client tarafından gönderilen özel bir paket üzerinden işletim sistemi bilgisi alınabilir. Bu işlem için, pack yapısı genişletilmeli ve yeni bir mesaj tipi tanımlanmalıdır.
Örnek C++ Kod Parçası
Kod:
struct TOSInfoPacket {[BR][/BR]char header;[BR][/BR]char os_type; // 0 = Windows, 1 = Linux, 2 = macOS[BR][/BR]int version_major;[BR][/BR]int version_minor;[BR][/BR]};
Bu yapıyla, sunucu tarafında recv() fonksiyonu ile alınan veri parse edilir ve loglanır. Loglama işlemleri genellikle log.txt dosyasına veya veritabanına yazılır. Güvenlik açısından bu loglar düzenli olarak incelenmeli ve anormal girişler kontrol edilmelidir.
Python ve Py GUI Entegrasyonu
Sunucu loglarını daha okunabilir ve analiz edilebilir hale getirmek için, Python kullanarak bir log analiz aracı geliştirilebilir. Py GUI veya Tkinter gibi arayüz kütüphaneleriyle görsel bir log görüntüleyici oluşturulabilir. Böylece, hangi işletim sistemlerinden ne kadar bağlantı olduğu, hangi sistemlerde hata oranı yüksekse gibi bilgiler daha kolay takip edilebilir.
Martysama ve Metin2 Development Araçları
Metin2 geliştirme topluluğu içinde özellikle martysama gibi isimler, source edit konularında birçok örnek sunmuştur. Onların geliştirdiği sistemlerde, client tarafında küçük değişikliklerle sistem bilgisi alınabiliyor ve bu bilgi sunucuya aktarılıyor. Bu sayede, geliştiricilerin db core ve game core üzerinde daha güvenli bir kontrol sağlayabilmesi mümkün hale geliyor.
Sonuç
Metin2 özel sunucu geliştirme sürecinde, kullanıcıların kullandığı işletim sistemlerini takip etmek, güvenlik açıklarını erken fark etmek ve sunucu performansını optimize etmek açısından hayati bir rol oynar. C++ tabanlı sunucu yapıları ile bu işlemi otomatikleştirmek, uzun vadede daha kararlı ve gelişmiş bir PvP sistem sunumuna imkan tanır. Ayrıca, log verileri üzerinden elde edilen istatistiklerle, server src üzerinde yapılacak güncellemeler daha hedefli yapılabilir.
Metin2 Server Development Series: Logging Player Operating Systems with C++
Introduction
In the process of developing Metin2 private servers, tracking and analyzing the operating systems running on players' devices is crucial for both security and performance. For developers working with C++ based game core and auth server structures, identifying whether players are connecting from Windows, Linux, or macOS can help predict potential security risks in advance. In this article, we will examine in detail how to develop a system that logs OS information during player connections using C++.
Player Connection and Data Collection
When a player connects to a Metin2 server, certain initial packets are sent by the client. One of these packets may contain information about the environment the client is running in. If system information is not directly sent, this data can be extended and transmitted from the client src side. For example, platform definitions in client/src/UserInterface/Locale_inc.h can be sent to the server.
Identifying Operating System with C++ on Server Side
On the server side, incoming connections are handled by the game server. After the player's identity is verified, OS information can be retrieved through a special packet sent during the initial handshake with the auth server. To achieve this, the pack structure should be expanded and a new message type defined.
Sample C++ Code Snippet
Kod:
struct TOSInfoPacket {[BR][/BR]char header;[BR][/BR]char os_type; // 0 = Windows, 1 = Linux, 2 = macOS[BR][/BR]int version_major;[BR][/BR]int version_minor;[BR][/BR]};
Using this structure, data received via the recv() function on the server side is parsed and logged. Logging operations are usually written to a log.txt file or database. For security purposes, these logs should be regularly reviewed and abnormal entries checked.
Integration with Python and Py GUI
To make server logs more readable and analyzable, a log analysis tool can be developed using Python. Visual log viewers can be created using GUI libraries such as Py GUI or Tkinter. This allows easier tracking of connection statistics by OS, as well as identifying which systems have higher error rates.
Martysama and Metin2 Development Tools
Within the Metin2 development community, figures like martysama have provided many examples in the area of source edit. In their developed systems, minor client-side modifications allow system information to be captured and sent to the server. This enables developers to maintain safer control over db core and game core components.
Conclusion
In the process of developing Metin2 private servers, monitoring the operating systems used by players plays a vital role in detecting security vulnerabilities early and optimizing server performance. Automating this process with C++-based server structures allows for more stable and advanced PvP system implementations in the long run. Additionally, statistics gathered from log data enable more targeted updates to server src.
