| rapierrr |
09-02-2012 14:33 |
Socket a2s_players
How to get another server's player list using sockets?
Server info (A2S_INFO) works perfectly, but player list and query challenge not.
No response for FF FF FF FF 57 query. I'm tried FF FF FF FF 55 FF FF FF FF (alternative challenge get) too, but server returns only -1.
Quote:
The challenge number can either be set to -1 (0xFF FF FF FF) to have the server reply with S2C_CHALLENGE, or use the value from a previous A2S_SERVERQUERY_GETCHALLENGE request.
|
Quote from: https://developer.valvesoftware.com/...Y_GETCHALLENGE
PHP Code:
#include <amxmodx> #include <sockets>
#define PLUGIN "asd" #define AUTHOR "RapieR" #define VERSION "0.0"
new gServerIp[32]; new gServerPort[6];
new gSocketChallenge;
public plugin_init(){ register_plugin(PLUGIN, VERSION, AUTHOR); new pcVarServerIp = register_cvar("amx_server", "127.0.0.1:27015"); get_pcvar_string(pcVarServerIp, gServerIp, charsmax(gServerIp)); strtok(gServerIp, gServerIp, 31, gServerPort, 5, ':'); set_task(5.0, "GetChallenge", 0, "", 0); } public GetChallenge(){ if(gSocketChallenge > 0) return; new iError; gSocketChallenge = socket_open(gServerIp, str_to_num(gServerPort), SOCKET_UDP, iError); if(gSocketChallenge <= 0 || iError){ switch(iError){ case 0 : log_amx("No error!"); case 1 : log_amx("Error while creating socket"); case 2 : log_amx("Couldn't resolve hostname"); case 3 : log_amx("Couldn't connect to given hostname : port"); } return; } new iRequest[6]; format(iRequest, 5, "%c%c%c%c%c", 255, 255, 255, 255, 87); //for(new i = -1; i < 4; i++) socket_send2(gSocketChallenge, iRequest, 5); set_task(0.1, "ReceiveChallenge", 387, _, _, "b"); set_task(1.0, "EndChallenge"); } public ReceiveChallenge(){ if(socket_change(gSocketChallenge, 1)){ new iReceiveBuffer[1400], iReceiveBufferLength; iReceiveBufferLength = socket_recv(gSocketChallenge, iReceiveBuffer, charsmax(iReceiveBuffer)); if(iReceiveBufferLength > 5){ if(equal(iReceiveBuffer, {-1, -1, -1, -1}, 4)){ new aIndexes[100]; if(iReceiveBuffer[4] == 'A'){ index_create(iReceiveBuffer, iReceiveBufferLength, "44", aIndexes); server_print("Type : %c", iReceiveBuffer[aIndexes[1]]); server_print("Challenge : %d", iReceiveBuffer[aIndexes[2]]); } } } } } public EndChallenge( ) { remove_task(387); socket_close(gSocketChallenge); gSocketChallenge = 0; }
|