| Offset | Type | Value | Description | |--------|-----------|-----------------------|--------------------------------| | 0 | BYTE | 0xFF | Protocol identifier | | 1 | BYTE | 0x50 | SID_GETGAMELIST (command 0x50) | | 2 | WORD (LE) | Packet length (often 8) | Header size + data | | 4 | DWORD (LE)| Session token (from auth) | Prevents unauthenticated queries | | 8 | WORD (LE) | Game flags (e.g., 0x01 = ladder) | Filtration mask | | 10 | BYTE | Number of players filter (0 = any) | Optional constraint | | 11 | BYTE | Reserved (0x00) | |
For enthusiasts: running your own Index Server 2 is surprisingly accessible. With a Linux VPS, 256MB of RAM, and PVPGN compiled with --enable-war3 and --enable-d2cs , you can host game listings for a hundred concurrent players. The B.net Index Server 2 was never glamorous. It didn’t render 3D graphics or manage inventories. It simply answered one question: “Where are the games?” But in answering that question reliably for over a decade, it enabled the golden age of online PC gaming—the era of dial-up StarCraft matches, LAN-style Diablo II Baal runs, and Warcraft III custom maps hosted from basement routers.
However, the protocol lives on. Open-source projects like (Player vs. Player Gaming Network) have re-implemented the entire B.net Index Server 2 specification. Community-run private servers for Diablo II , Warcraft III (pre-Reforged), and StarCraft use PVPGN’s bncsutil and BNetDb to emulate the Index Server behavior completely. Technical Deep Dive: The Index Server 2 Protocol Header For developers and modders, the raw packet structure is worth documenting. A typical SID_GETGAMELIST request to B.net Index Server 2 is 12 bytes: