KAYNAK KOD V2369 RE CONNECT SİSTEMİNİ PAYLAŞIYORUM 26.09.2026

KY Kıdemli Üye
KAYIT
18 Kas 2025
Mesajlar
355
Çözümler
2
Tepki puanı
151
Yaş
34
================================================================================
RE CONNECT SİSTEMİ - ARŞİV İÇİNDEKİLER
v2369 (Kaynak sürüm)
================================================================================

Arşiv Konumu : -
Oluşturma : 26.09.2026
Kaynak Ağacı : -SOURCE\GameServer (SUNUCU)
- Anti-Cheat v2369\...\Pearl Guard (İSTEMCİ)
Kodlama : UTF-8 (BOM'lu) — Not Defteri / VS Code / VS 2022 ile sorunsuz


--------------------------------------------------------------------------------
1. SİSTEM NEDİR?
--------------------------------------------------------------------------------
Yeniden bağlanma (Reconnect) sistemi, oyuncunun bağlantısı koptuğunda
karakterini sunucuda "askıda" tutan ve 15 saniye içinde aynı karaktere
tekrar bağlanmasını sağlayan mekanizmadır. Test komutu: /reconnecttest

Akış:
IN_GAME --Begin(15s)--> SUSPENDED --Confirm(token)--> IN_GAME
|
+--IsExpired()--> disconnect / kurtarma

Askıya alınan karakter oyunda kalır ANCAK:
* tüm oyuncu aksiyonları paket filtresiyle yutulur (sessizce),
* konum (anchor) sabitlenir, yeniden bağlanınca buraya dönülür,
* parti üyeliği ticket'a snapshot olarak alınır, resume'da geri bağlanır,
* merchant/genie durumu ticket'a kaydedilir.


--------------------------------------------------------------------------------
2. PROTOKOL (ağ paketleri)
--------------------------------------------------------------------------------
Ana kanal : XSafe (0xE9) -> alt opcode WIZ_RECONNECT (0xEE)
Paket yapısı: [XSafe 0xE9][WIZ_RECONNECT 0xEE][requestType][gövde]

requestType yönü açıklama
----------- ---------------------- ----------------------------------------
1 SUNUCU -> ISTEMCI token dağıtımı
2 ISTEMCI -> SUNUCU yeniden bağlanma isteği
3 SUNUCU -> ISTEMCI sonuç / ACK bildirimi
4 ISTEMCI -> SUNUCU transport durum bilgisi
5 SUNUCU -> ISTEMCI UI panelini aç (+ süre)
6 ISTEMCI -> SUNUCU panel "Yes" onayı
7 SUNUCU -> ISTEMCI onay / iptal işlendi
8 ISTEMCI -> SUNUCU hemen disconnect
9 SUNUCU -> ISTEMCI disconnect uygulandı
10 ISTEMCI -> SUNUCU "Yes" onayı (karakter ID dahil)
11 SUNUCU -> ISTEMCI reconnect hakkı iptal (premium düştü)

Güvenlik : RECONNECT_MAX_CONFIRM_ATTEMPTS = 5 (üst üste hatalı onayda
oturum sonlandırılır)
Süre : RECONNECT_TEST_HOLD_SECONDS = 15


--------------------------------------------------------------------------------
3. KLASÖR YAPISI
--------------------------------------------------------------------------------
RE CONNECT SİSTEMİ\
├── 00_IÇİNDEKİLER.txt (bu dosya)
├── 01_SUNUCU_ GameServer\
│ ├── ReconnectSuspend.h.txt ← ÇEKİRDEK (tam dosya)
│ ├── ReconnectSuspend.cpp.txt ← ÇEKİRDEK (tam dosya)
│ ├── 01_Define.h....txt ← protokol sabitleri
│ ├── 04_GameSocket.cpp....txt ← socket token gönderimi
│ ├── 05_PremiumSystem.cpp....txt ← premium bitişinde iptal
│ ├── 06_DatabaseThread.cpp....txt ← logout koruması
│ ├── 07_ServerStartStopHandler.cpp....txt ← sunucu açılış geri yükleme
│ ├── 08_ChatHandler.cpp....txt ← /reconnecttest komutu
│ ├── 09_PartyHandler.cpp....txt ← parti askı koruması
│ ├── 10_XGuard.cpp....txt ← 0xEE alt-opcode dispatch
│ ├── 11_CharacterSelectionHandler.cpp.txt ← karakter seçimi ACK
│ ├── 12_User.h....txt ← üye/metot bildirimleri
│ ├── 13_User.cpp....txt ← ANA İMPLEMENTASYON
│ └── 14_GameServerDlg.h....txt ← COMMAND_HANDLER bildirimi
└── 02_ISTEMCI_PearlGuard\
├── Pearl Engine.cpp.txt ← ANA İSTEMCİ MOTORU
├── MessageBoxUIF.cpp.txt ← onay penceresi (Yes/No)
├── PearlGui.cpp.txt ← PollReconnectUi() çağrısı
└── stdafx.h.txt ← istemci sabitleri


--------------------------------------------------------------------------------
4. DOSYA BİÇİMİ / OKUMA KURALLARI
--------------------------------------------------------------------------------
Her .txt dosyasının başında 8 satırlık başlık bloğu vardır:
DOSYA ADI / KAYNAK / SISTEM / BOYUT / ACIKLAMA / ESLESME

* ReconnectSuspend.h/.cpp → TAM DOSYA kopyasıdır (bütün içerik).
* "*.reconnect-bloklari.txt" → SADECE reconnect ile ilgili kod blokları.
Sol taraftaki " 1234 | " rakamları KAYNAK dosyadaki orijinal
satır numarasıdır; arama yaparken bu numaraları kullanın.
Kod blokları arasında bağlam satırları (bkz. >> KAYNAK SATIR X - Y)
yer alır.

Arama ipucu: her dosyada "KAYNAK SATIR" ifadesiyle blok başları,
"RECONNECT" (BÜYÜK HARF) ile sunucu tarafı sembolleri bulunur.


--------------------------------------------------------------------------------
5. EN ÖNEMLİ 4 DOSYA (port/review için başlangıç)
--------------------------------------------------------------------------------
1) 13_User.cpp.reconnect-bloklari.txt (4 blok / 287 eşleşme)
→ tüm reconnect mantığı: token üretimi, ticket, suspend, confirm,
resume, parti/merchant/genie snapshot ve paket filtresi
2) ReconnectSuspend.h.txt + .cpp.txt
→ CReconnectSuspend durum çekirdeği (CUser'dan bağımsız)
3) 01_Define.h.reconnect-bloklari.txt
→ 0xEE opcode ve 11 requestType tanımları (protokol sözleşmesi)
4) Pearl Engine.cpp.txt
→ istemci tarafı alıcı/satıcı + UI panel tetikleyici

================================================================================
KAYNAK KODLARI İLE BİRLİKTE PAYLAŞIYORUM CPP VE DOSYA YOLLARI İLE BİRLİKTE
KULLANDIĞIM SOURCE İSE DEAFSOFT V2369 PAYLAŞTIĞI KAYNAK
 

Ekli dosyalar

  • RE CONNECT SİSTEMİ.zip
    160.8 KB · Görüntüleme: 41
KY Üye
KAYIT
26 Eyl 2025
Mesajlar
19
Tepki puanı
1
================================================================================
RE CONNECT SİSTEMİ - ARŞİV İÇİNDEKİLER
v2369 (Kaynak sürüm)
================================================================================

Arşiv Konumu : -
Oluşturma : 26.09.2026
Kaynak Ağacı : -SOURCE\GameServer (SUNUCU)
- Anti-Cheat v2369\...\Pearl Guard (İSTEMCİ)
Kodlama : UTF-8 (BOM'lu) — Not Defteri / VS Code / VS 2022 ile sorunsuz


--------------------------------------------------------------------------------
1. SİSTEM NEDİR?
--------------------------------------------------------------------------------
Yeniden bağlanma (Reconnect) sistemi, oyuncunun bağlantısı koptuğunda
karakterini sunucuda "askıda" tutan ve 15 saniye içinde aynı karaktere
tekrar bağlanmasını sağlayan mekanizmadır. Test komutu: /reconnecttest

Akış:
IN_GAME --Begin(15s)--> SUSPENDED --Confirm(token)--> IN_GAME
|
+--IsExpired()--> disconnect / kurtarma

Askıya alınan karakter oyunda kalır ANCAK:
* tüm oyuncu aksiyonları paket filtresiyle yutulur (sessizce),
* konum (anchor) sabitlenir, yeniden bağlanınca buraya dönülür,
* parti üyeliği ticket'a snapshot olarak alınır, resume'da geri bağlanır,
* merchant/genie durumu ticket'a kaydedilir.


--------------------------------------------------------------------------------
2. PROTOKOL (ağ paketleri)
--------------------------------------------------------------------------------
Ana kanal : XSafe (0xE9) -> alt opcode WIZ_RECONNECT (0xEE)
Paket yapısı: [XSafe 0xE9][WIZ_RECONNECT 0xEE][requestType][gövde]

requestType yönü açıklama
----------- ---------------------- ----------------------------------------
1 SUNUCU -> ISTEMCI token dağıtımı
2 ISTEMCI -> SUNUCU yeniden bağlanma isteği
3 SUNUCU -> ISTEMCI sonuç / ACK bildirimi
4 ISTEMCI -> SUNUCU transport durum bilgisi
5 SUNUCU -> ISTEMCI UI panelini aç (+ süre)
6 ISTEMCI -> SUNUCU panel "Yes" onayı
7 SUNUCU -> ISTEMCI onay / iptal işlendi
8 ISTEMCI -> SUNUCU hemen disconnect
9 SUNUCU -> ISTEMCI disconnect uygulandı
10 ISTEMCI -> SUNUCU "Yes" onayı (karakter ID dahil)
11 SUNUCU -> ISTEMCI reconnect hakkı iptal (premium düştü)

Güvenlik : RECONNECT_MAX_CONFIRM_ATTEMPTS = 5 (üst üste hatalı onayda
oturum sonlandırılır)
Süre : RECONNECT_TEST_HOLD_SECONDS = 15


--------------------------------------------------------------------------------
3. KLASÖR YAPISI
--------------------------------------------------------------------------------
RE CONNECT SİSTEMİ\
├── 00_IÇİNDEKİLER.txt (bu dosya)
├── 01_SUNUCU_ GameServer\
│ ├── ReconnectSuspend.h.txt ← ÇEKİRDEK (tam dosya)
│ ├── ReconnectSuspend.cpp.txt ← ÇEKİRDEK (tam dosya)
│ ├── 01_Define.h....txt ← protokol sabitleri
│ ├── 04_GameSocket.cpp....txt ← socket token gönderimi
│ ├── 05_PremiumSystem.cpp....txt ← premium bitişinde iptal
│ ├── 06_DatabaseThread.cpp....txt ← logout koruması
│ ├── 07_ServerStartStopHandler.cpp....txt ← sunucu açılış geri yükleme
│ ├── 08_ChatHandler.cpp....txt ← /reconnecttest komutu
│ ├── 09_PartyHandler.cpp....txt ← parti askı koruması
│ ├── 10_XGuard.cpp....txt ← 0xEE alt-opcode dispatch
│ ├── 11_CharacterSelectionHandler.cpp.txt ← karakter seçimi ACK
│ ├── 12_User.h....txt ← üye/metot bildirimleri
│ ├── 13_User.cpp....txt ← ANA İMPLEMENTASYON
│ └── 14_GameServerDlg.h....txt ← COMMAND_HANDLER bildirimi
└── 02_ISTEMCI_PearlGuard\
├── Pearl Engine.cpp.txt ← ANA İSTEMCİ MOTORU
├── MessageBoxUIF.cpp.txt ← onay penceresi (Yes/No)
├── PearlGui.cpp.txt ← PollReconnectUi() çağrısı
└── stdafx.h.txt ← istemci sabitleri


--------------------------------------------------------------------------------
4. DOSYA BİÇİMİ / OKUMA KURALLARI
--------------------------------------------------------------------------------
Her .txt dosyasının başında 8 satırlık başlık bloğu vardır:
DOSYA ADI / KAYNAK / SISTEM / BOYUT / ACIKLAMA / ESLESME

* ReconnectSuspend.h/.cpp → TAM DOSYA kopyasıdır (bütün içerik).
* "*.reconnect-bloklari.txt" → SADECE reconnect ile ilgili kod blokları.
Sol taraftaki " 1234 | " rakamları KAYNAK dosyadaki orijinal
satır numarasıdır; arama yaparken bu numaraları kullanın.
Kod blokları arasında bağlam satırları (bkz. >> KAYNAK SATIR X - Y)
yer alır.

Arama ipucu: her dosyada "KAYNAK SATIR" ifadesiyle blok başları,
"RECONNECT" (BÜYÜK HARF) ile sunucu tarafı sembolleri bulunur.


--------------------------------------------------------------------------------
5. EN ÖNEMLİ 4 DOSYA (port/review için başlangıç)
--------------------------------------------------------------------------------
1) 13_User.cpp.reconnect-bloklari.txt (4 blok / 287 eşleşme)
→ tüm reconnect mantığı: token üretimi, ticket, suspend, confirm,
resume, parti/merchant/genie snapshot ve paket filtresi
2) ReconnectSuspend.h.txt + .cpp.txt
→ CReconnectSuspend durum çekirdeği (CUser'dan bağımsız)
3) 01_Define.h.reconnect-bloklari.txt
→ 0xEE opcode ve 11 requestType tanımları (protokol sözleşmesi)
4) Pearl Engine.cpp.txt
→ istemci tarafı alıcı/satıcı + UI panel tetikleyici

================================================================================
KAYNAK KODLARI İLE BİRLİKTE PAYLAŞIYORUM CPP VE DOSYA YOLLARI İLE BİRLİKTE
KULLANDIĞIM SOURCE İSE DEAFSOFT V2369 PAYLAŞTIĞI KAYNAK
1
 
KY Kıdemli Üye
KAYIT
21 Ara 2023
Mesajlar
187
Tepki puanı
24
================================================================================
RE CONNECT SİSTEMİ - ARŞİV İÇİNDEKİLER
v2369 (Kaynak sürüm)
================================================================================

Arşiv Konumu : -
Oluşturma : 26.09.2026
Kaynak Ağacı : -SOURCE\GameServer (SUNUCU)
- Anti-Cheat v2369\...\Pearl Guard (İSTEMCİ)
Kodlama : UTF-8 (BOM'lu) — Not Defteri / VS Code / VS 2022 ile sorunsuz


--------------------------------------------------------------------------------
1. SİSTEM NEDİR?
--------------------------------------------------------------------------------
Yeniden bağlanma (Reconnect) sistemi, oyuncunun bağlantısı koptuğunda
karakterini sunucuda "askıda" tutan ve 15 saniye içinde aynı karaktere
tekrar bağlanmasını sağlayan mekanizmadır. Test komutu: /reconnecttest

Akış:
IN_GAME --Begin(15s)--> SUSPENDED --Confirm(token)--> IN_GAME
|
+--IsExpired()--> disconnect / kurtarma

Askıya alınan karakter oyunda kalır ANCAK:
* tüm oyuncu aksiyonları paket filtresiyle yutulur (sessizce),
* konum (anchor) sabitlenir, yeniden bağlanınca buraya dönülür,
* parti üyeliği ticket'a snapshot olarak alınır, resume'da geri bağlanır,
* merchant/genie durumu ticket'a kaydedilir.


--------------------------------------------------------------------------------
2. PROTOKOL (ağ paketleri)
--------------------------------------------------------------------------------
Ana kanal : XSafe (0xE9) -> alt opcode WIZ_RECONNECT (0xEE)
Paket yapısı: [XSafe 0xE9][WIZ_RECONNECT 0xEE][requestType][gövde]

requestType yönü açıklama
----------- ---------------------- ----------------------------------------
1 SUNUCU -> ISTEMCI token dağıtımı
2 ISTEMCI -> SUNUCU yeniden bağlanma isteği
3 SUNUCU -> ISTEMCI sonuç / ACK bildirimi
4 ISTEMCI -> SUNUCU transport durum bilgisi
5 SUNUCU -> ISTEMCI UI panelini aç (+ süre)
6 ISTEMCI -> SUNUCU panel "Yes" onayı
7 SUNUCU -> ISTEMCI onay / iptal işlendi
8 ISTEMCI -> SUNUCU hemen disconnect
9 SUNUCU -> ISTEMCI disconnect uygulandı
10 ISTEMCI -> SUNUCU "Yes" onayı (karakter ID dahil)
11 SUNUCU -> ISTEMCI reconnect hakkı iptal (premium düştü)

Güvenlik : RECONNECT_MAX_CONFIRM_ATTEMPTS = 5 (üst üste hatalı onayda
oturum sonlandırılır)
Süre : RECONNECT_TEST_HOLD_SECONDS = 15


--------------------------------------------------------------------------------
3. KLASÖR YAPISI
--------------------------------------------------------------------------------
RE CONNECT SİSTEMİ\
├── 00_IÇİNDEKİLER.txt (bu dosya)
├── 01_SUNUCU_ GameServer\
│ ├── ReconnectSuspend.h.txt ← ÇEKİRDEK (tam dosya)
│ ├── ReconnectSuspend.cpp.txt ← ÇEKİRDEK (tam dosya)
│ ├── 01_Define.h....txt ← protokol sabitleri
│ ├── 04_GameSocket.cpp....txt ← socket token gönderimi
│ ├── 05_PremiumSystem.cpp....txt ← premium bitişinde iptal
│ ├── 06_DatabaseThread.cpp....txt ← logout koruması
│ ├── 07_ServerStartStopHandler.cpp....txt ← sunucu açılış geri yükleme
│ ├── 08_ChatHandler.cpp....txt ← /reconnecttest komutu
│ ├── 09_PartyHandler.cpp....txt ← parti askı koruması
│ ├── 10_XGuard.cpp....txt ← 0xEE alt-opcode dispatch
│ ├── 11_CharacterSelectionHandler.cpp.txt ← karakter seçimi ACK
│ ├── 12_User.h....txt ← üye/metot bildirimleri
│ ├── 13_User.cpp....txt ← ANA İMPLEMENTASYON
│ └── 14_GameServerDlg.h....txt ← COMMAND_HANDLER bildirimi
└── 02_ISTEMCI_PearlGuard\
├── Pearl Engine.cpp.txt ← ANA İSTEMCİ MOTORU
├── MessageBoxUIF.cpp.txt ← onay penceresi (Yes/No)
├── PearlGui.cpp.txt ← PollReconnectUi() çağrısı
└── stdafx.h.txt ← istemci sabitleri


--------------------------------------------------------------------------------
4. DOSYA BİÇİMİ / OKUMA KURALLARI
--------------------------------------------------------------------------------
Her .txt dosyasının başında 8 satırlık başlık bloğu vardır:
DOSYA ADI / KAYNAK / SISTEM / BOYUT / ACIKLAMA / ESLESME

* ReconnectSuspend.h/.cpp → TAM DOSYA kopyasıdır (bütün içerik).
* "*.reconnect-bloklari.txt" → SADECE reconnect ile ilgili kod blokları.
Sol taraftaki " 1234 | " rakamları KAYNAK dosyadaki orijinal
satır numarasıdır; arama yaparken bu numaraları kullanın.
Kod blokları arasında bağlam satırları (bkz. >> KAYNAK SATIR X - Y)
yer alır.

Arama ipucu: her dosyada "KAYNAK SATIR" ifadesiyle blok başları,
"RECONNECT" (BÜYÜK HARF) ile sunucu tarafı sembolleri bulunur.


--------------------------------------------------------------------------------
5. EN ÖNEMLİ 4 DOSYA (port/review için başlangıç)
--------------------------------------------------------------------------------
1) 13_User.cpp.reconnect-bloklari.txt (4 blok / 287 eşleşme)
→ tüm reconnect mantığı: token üretimi, ticket, suspend, confirm,
resume, parti/merchant/genie snapshot ve paket filtresi
2) ReconnectSuspend.h.txt + .cpp.txt
→ CReconnectSuspend durum çekirdeği (CUser'dan bağımsız)
3) 01_Define.h.reconnect-bloklari.txt
→ 0xEE opcode ve 11 requestType tanımları (protokol sözleşmesi)
4) Pearl Engine.cpp.txt
→ istemci tarafı alıcı/satıcı + UI panel tetikleyici

================================================================================
KAYNAK KODLARI İLE BİRLİKTE PAYLAŞIYORUM CPP VE DOSYA YOLLARI İLE BİRLİKTE
KULLANDIĞIM SOURCE İSE DEAFSOFT V2369 PAYLAŞTIĞI KAYNAK


Emeğine sağlık
 
KY Uzman Üye
Yardımsever
KAYIT
2 Ağu 2025
Mesajlar
434
Çözümler
4
Tepki puanı
584
eline sağlık değerli paylaşımın için :)
 
KY Saygın Üye
Yardımsever
Server Sahibi
KAYIT
16 Nis 2023
Mesajlar
464
Çözümler
14
Tepki puanı
341
Web
letskogame.com
Emegine Saglik
 
KY Üye
KAYIT
6 Şub 2022
Mesajlar
77
Tepki puanı
2
Emeğine sağlık, paylaşman güzel. Kodu satır satır inceledim ve reconnect'i kendi projemde sıfırdan yazdım. Bu sistemi olduğu gibi canlıya almayı düşünenler için birkaç not bırakayım, çünkü canlı sunucuda ciddi sorun çıkarır.

Neden direkt kullanmamak lazım:

  • Başkasını oyundan atmak mümkün. "Oyunda kal" ve "hemen disconnect" istekleri token'ı doğrulamıyor, pakette gelen hesap adına bakıp işlem yapıyor. Resume tarafında da eski oturum, ticket'taki hesaba göre değil paketten gelen hesap adına göre düşürülüyor.
  • Token zayıf. 32 bit ve saatle soket numarasından türetiliyor, tahmin edilebilir. Deneme sınırı da yok.
  • Giriş kontrolleri atlanıyor. Resume'da hesap adı elle set edilip doğrudan karakter seçimine geçiliyor. Ban, yetki ve premium gibi DB giriş kontrollerinin hiçbiri çalışmıyor.
  • Parti bozulabiliyor. Parti üyeliği ölü oturumun soket numarasıyla tutuluyor. Soket numaraları yeniden kullanıldığı için o numara başka birine düşerse yanlış kişi partinin içinde görünür.
  • Item dupe riski. Pazar item'ları bellekteki snapshot'tan geri yükleniyor, envanter ise logout'ta DB'ye yazılmış oluyor. Bu tür iki kaynaklı geri yükleme dupe'a çok açık.
  • İstemci donuyor. Bridge modunda oyunun recv çağrısı Sleep döngüsünde bekletiliyor. KO bu çağrıyı ana thread'de yaptığı için oyun kopukken 20 saniyeye kadar donuyor.
  • Port sabit yazılmış, RECONNECT_DISCOVERY gibi deneme kodları hâlâ içinde ve premium kontrolü her yere dağılmış. Temizlenmeden kullanılacak bir kod değil.
Nasıl yapılmalı (benim uyguladığım ve test ettiğim yol):

  1. Karakteri askıda tutma. Kopan oturum normal logout ile kapansın ve DB'ye kaydedilsin. Yeni giriş karakteri DB'den temiz yüklesin. Böylece dupe ve geri alma riski kalmıyor, parti ya da pazar için özel geri yükleme kodu da gerekmiyor.
  2. Token sağlam olsun. Oyuna girişte sunucu 16 bayt kriptografik rastgele bir token üretsin (BCryptGenRandom), hesaba bağlasın, tek kullanımlık olsun. Şifreyi istemcide saklamayın.
  3. Token sadece gerçek ağ kopmasında geçerli olsun. Soket katmanında ağ hatasıyla kapanan bağlantıyı işaretleyin. GM kick, anti-cheat atması, bilinçli çıkış gibi sunucunun kendi yaptığı kesmelerde token'ı silin; yoksa reconnect kick'i aşmanın yolu olur.
  4. Girişi DB yolundan geçirin. Token doğrulandıktan sonra hesabı DB'nin kendi login prosedüründen geçirin (şifre olarak DB'deki kayıtlı değeri kullanarak). Ban ve yetki kontrolleri böylece korunur. Eski oturum hâlâ sunucuda duruyorsa önce onu atın, istemci 2 saniye sonra tekrar denesin. Eski karakter DB'ye yazılmadan yenisi yüklenmesin.
  5. İstemci tarafı basit kalsın. Ayrı soket veya bridge açmaya gerek yok. İstemcinin "bağlantı koptu" fonksiyonunu detour edip pencereyi açın. Oyunun kendi Connect fonksiyonuyla aynı game sunucusuna tekrar bağlanın. Karakter seçim cevabını client zaten kendisi işliyor, zonu kuruyor ve GAMESTART'ı kendisi gönderiyor.
  6. Tuzaklara dikkat:
    • Sunucunuzda aynı IP'den gelen hızlı bağlantıları kesen bir flood koruması varsa (bizde 650 ms idi) iki bağlantı arasında bekleme koyun. Ben bunu log bile düşmediği için epey aradım.
    • Client yeniden bağlanır bağlanmaz eski oyun paketlerini göndermeye devam ediyor. Sunucu, doğrulanmış bir reconnect bağlantısında karakter oyuna girene kadar bilinmeyen paketleri düşürmek yerine yok saymalı.
    • Sunucu kapalıyken connect() ana thread'i kilitlemesin; erişilebilirliği ayrı bir thread'de kısa bir timeout ile kontrol edin.
Bu şekilde test ettim: bağlantı kopuyor, 15 saniye geri sayımdan sonra karakter aynı yerde, envanter ve bufflarıyla geri geliyor. Paylaşım için tekrar teşekkürler; en azından protokol tasarımı üzerine düşünmek için iyi bir başlangıç noktası oldu.
 
Üst Alt