Thanks for your help, but I got it. I just needed to fire up my packet sniffer and look at the packets directly. It turns out that they were just ints.
What I have now is a command line tool that will connect to a server and tell you the status. More to come... Dave -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of tei Sent: Monday, May 03, 2004 9:25 AM To: [EMAIL PROTECTED] Subject: Re: [hlcoders] server protocol Half-Life is a Quake1 base engine mod (like Tenebrae, DarkPlaces or Telejano) I found some similar source code from a Quake1 engine. Here: http://www.quakeforge.net/doxygen/net__dgrm_8c-source.html#l01104 00869 if (command == CCREQ_SERVER_INFO) { 00870 if (strcmp (MSG_ReadString (net_message), "QUAKE") != 0) 00871 return NULL; 00872 00873 SZ_Clear (net_message->message); 00874 // save space for the header, filled in later 00875 MSG_WriteLong (net_message->message, 0); 00876 MSG_WriteByte (net_message->message, CCREP_SERVER_INFO); 00877 dfunc.GetSocketAddr (acceptsock, &newaddr); 00878 MSG_WriteString (net_message->message, dfunc.AddrToString (&newaddr)); 00879 MSG_WriteString (net_message->message, hostname->string); 00880 MSG_WriteString (net_message->message, sv.name); 00881 MSG_WriteByte (net_message->message, net_activeconnections); 00882 MSG_WriteByte (net_message->message, svs.maxclients); 00883 MSG_WriteByte (net_message->message, NET_PROTOCOL_VERSION); 00884 *((int *) net_message->message->data) = 00885 BigLong (NETFLAG_CTL | 00886 (net_message->message->cursize & NETFLAG_LENGTH_MASK)); 00887 dfunc.Write (acceptsock, net_message->message->data, 00888 net_message->message->cursize, &clientaddr); 00889 SZ_Clear (net_message->message); Ok, Half-Life code will be different, has this is C and HL will be C++, and because Valve has rewriten most code (with nice results!). But maybe this will be informative for some coder hacker here :D Here is more informative code (GPL license, the same enginemod) char *WINS_AddrToString (struct qsockaddr *addr) { static char buffer[22]; int haddr; haddr = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr); sprintf(buffer, "%d.%d.%d.%d:%d", (haddr >> 24) & 0xff, (haddr >> 16) & 0xff, (haddr >> 8) & 0xff, haddr & 0xff, ntohs(((struct sockaddr_in *)addr)->sin_port)); return buffer; } //====================================================================== ======= int WINS_StringToAddr (char *string, struct qsockaddr *addr) { int ha1, ha2, ha3, ha4, hp; int ipaddr; sscanf(string, "%d.%d.%d.%d:%d", &ha1, &ha2, &ha3, &ha4, &hp); ipaddr = (ha1 << 24) | (ha2 << 16) | (ha3 << 8) | ha4; addr->sa_family = AF_INET; ((struct sockaddr_in *)addr)->sin_addr.s_addr = htonl(ipaddr); ((struct sockaddr_in *)addr)->sin_port = htons((unsigned short)hp); return 0; } Good Luck! David Fencik escribi�: > This is a multi-part message in MIME format. > -- > [ Picked text/plain from multipart/alternative ] > I am playing around with an old proggy I wrote a couple years ago that > connected to a server and did rcon commands (good thing I comment my > code). I modified it to connect to a server and issue an "info" > command. Here is the packet the server sends back: > Server responds with the following packet: > (int32) -1 > (byte) ASCII 'C' (info response, S2A_INFO) > (string) net address of server > (string) name of the host / server > (string) name of the map > (string) game directory (i.e. valve/) > (string) Game description (e.g. "half-life > multiplay") > (byte) active client count > (byte) maximum clients allowed > (byte) protocol version > > I am able to parse the packet and get the netaddress, name, directory, > and description. I can't seem to figure out how to get the client > count, maxplayers, or protocol version. In the serverprotocol.txt, it > only says that they are bytes. > > Here's a snippet of my code: > > strcpy(netAddress, szRecvBuffer+c); > c = c + strlen(netAddress) + 1; > strcpy(hostName, szRecvBuffer+c); > c = c + strlen(hostName) + 1; > strcpy(mapName, szRecvBuffer+c); > c = c + strlen(mapName) + 1; > strcpy(gameDir, szRecvBuffer+c); > c = c + strlen(gameDir) + 1; > strcpy(gameDesc, szRecvBuffer+c); > c = c + strlen(gameDesc) + 1; > strcpy(clientCount, szRecvBuffer+c); > c = c + strlen(clientCount) + 1; > > The part where I parse the clientCount does not work. > > I want to make this program ping all of my half life servers (100+), > outputting some brief info, and issuing an alert when one goes down. Of > course, I will share when complete. > > Dave > > -- > > > _______________________________________________ > To unsubscribe, edit your list preferences, or view the list archives, please visit: > http://list.valvesoftware.com/mailman/listinfo/hlcoders > > _______________________________________________ To unsubscribe, edit your list preferences, or view the list archives, please visit: http://list.valvesoftware.com/mailman/listinfo/hlcoders _______________________________________________ To unsubscribe, edit your list preferences, or view the list archives, please visit: http://list.valvesoftware.com/mailman/listinfo/hlcoders

