Advertisement
Guest User

Minecraft Server List Ping

a guest
Jan 16th, 2017
1,785
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. // -----------------------------
  2.     #include <cstring>
  3.     #include <iostream>
  4.     #include <winsock2.h>
  5. // -----------------------------
  6. //  0xDEAD00 = 14593280
  7.  
  8. int main(int argc, char* argv[]){
  9.  
  10.     // host
  11.     char*          host = "mc-pl.net";
  12.     unsigned short port = 25565;
  13.  
  14.     // WinSockAPI startup
  15.     WSADATA     wsaData;
  16.     SOCKADDR_IN saddr;
  17.     SOCKET      sock;
  18.  
  19.     WSAStartup( MAKEWORD(2,2), &wsaData );
  20.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  21.  
  22.     // resolve hostname
  23.     LPHOSTENT hostEntry = gethostbyname(host);
  24.     if ( !hostEntry ){
  25.         unsigned int addr = inet_addr(host);
  26.         hostEntry = gethostbyaddr( (char*)&addr, 4, AF_INET);
  27.         if ( !hostEntry ) return 0xDEAD01;
  28.         }   /* can't resolve hostname */
  29.  
  30.  
  31.     saddr.sin_addr.S_un.S_addr
  32.         = *((int*)*hostEntry->h_addr_list);
  33.     saddr.sin_family = AF_INET;
  34.     saddr.sin_port = htons(port);
  35.  
  36.     // establishing connection
  37.     if ( connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR )
  38.         return 0xDEAD02; /* connection is not established */
  39.  
  40.     // constructing "handshake" packet
  41.     char  handshake[] = {0x14, 0x00, 0xD2, 0x01, 0x0D,
  42.                          '1',  '5',  '1', '.',
  43.                          '8',  '0',  '.',
  44.                          '1',  '0', '8', '.',
  45.                          '1', '5',
  46.                          0x63, 0xDD, 0x01 };
  47.     char &hs_lenght = handshake[0];
  48.  
  49.     // constructing "request" packet
  50.     char  request[] = {0x01, 0x00};
  51.     char &rq_lenght = request[0];
  52.  
  53.     // server status request
  54.     char  buffer [ 0x10000 ];
  55.     short bytes_sent = 0;
  56.     short bytes_readen = 0;
  57.  
  58.         /* assuming succesful sending and reciving */
  59.     bytes_sent   += send( sock, handshake, hs_lenght+1, 0 );
  60.     bytes_sent   += send( sock, request,   rq_lenght+1, 0 );
  61.     bytes_readen += recv( sock, buffer,    0x10000,     0 );
  62.  
  63.     // ping pong
  64.     char  ping[ 10 ] = { 0x09, 0x01, /* any 8 bytes */ };
  65.     char  pong[ 10 ] ; /* pong should be same as ping */
  66.  
  67.     send( sock, ping, 10, 0 );
  68.     recv( sock, pong, 10, 0 );
  69.  
  70.     // analising and displaying results
  71.     char* JSON = (char*) memchr( buffer, '{', 12 );
  72.         /* 12 = (2 * varint + PacketID) */
  73.  
  74.     if ( !memcmp( ping, pong, 10 ) )
  75.         std::cout << JSON << '\n' << '\n'
  76.                   << "\tping pong is:\tOK!\n"
  77.                   << "\tbytes sent:\t"   << bytes_sent << '\n'
  78.                   << "\tbytes readen:\t" << bytes_readen << '\n';
  79.     else return 0xDEAD00; /* ping pong failed */
  80.  
  81.     // EOC - end of coding ;P (today's)
  82.     closesocket(sock);
  83.     WSACleanup();
  84.     return 0x0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement