Join Helbreath
Would you like to react to this message? Create an account in a few clicks or log in to continue.


An essential info site for anyone learning the game. Great community and often very insightful posts.
 
HomeUseful information for Helbreath beginnersPlay, discover, and broadcast your Helbreath moments for free.Statistics overviewSearchMemberlistRulesRegisterLog in
 

 CLIENT con DNS

Go down 
AuthorMessage
SabbaT[GM]
‏‏‎ ‎‏‏‎ ‎
‏‏‎ ‎‏‏‎ ‎
SabbaT[GM]

Posts : 37

CLIENT con DNS Empty
PostSubject: CLIENT con DNS   CLIENT con DNS 999105/26/2020, 9:31 pm

hola gente! este code deberían tenerlo en la comunidad.
no vi que lo tuvieran asique lo subo.
el codigo original quedo obsoleto por que usaba winsock.h
la unica funcion que usaba era "gethostbyname" pero con el desarrollo de winsock2.h quedo obsoleta y abierto a bugs.

si hay un problema que pudre a los novatos de los servidores es tener que  compilar los clientes cada ves q se les cambia el ip de internet.

también nos sacamos de encima el login.cfg asi que los user ya no tienen que modificarlo manualmente o pedirla.

primeramente, vamos a noip.com y nos registramos
luego logeamos.

vamos a dynamic dns (a la izquierda, columna gris)
busquen el botón verde, "create host"

en Hostname pongan el nombre que quieran.
ejemplo: HB1

en Domain pongan el que quieran.
ejemplo "ddns.net"

en record Type dejen "DNS Host(A)"

le dan a crear hostname.

repetimos el proceso para HB2(mas adelante vas a ver porque)
ambos servidores DNS van a durar 30 dias.
si los quieren permanentes. COMPREN LICENCIA(seria conveniente)


bien, buscamos mas abajo en dynamic dns: "Dynamic Update Client"

rapidito, descargan, instalan, loguean.
cuando logeen van a ver el "STATUS".
describe el clientID, la cuenta, el ip, etc.

vamos a file, preferences, verifiquen las dos casillas de arriba.
network options por ahora lo ignoramos.
cerramos la ventanita.

vamos al boton "edit hosts"
y nos apareceran nuestros servidores DNS, HB1 y HB2.

**deben cerciorarse de la siquiente configuracion:

verifiquen la casilla del HB1, y la del HB2 NO. presionar "save".
vamos a file, preferences, ahora en network options.
seteamos "use the ip of my local network adapter"
cerramos, presionamos refresh. 

vamos a "edit hosts", ahora verificamos HB2, pero HB1 NO.
presionar save.
vamos a file, preferences, seteamos "detect my ip using remote methods"
cerramos y presionamos refresh.

listo, nuestros servidores HB1 tiene la ip local seteada.
y esta no va a cambiar.

HB2 tiene la ip de internet seteada, y va a cambiar y va a ser refrescada a cada rato por el DUC
por que recuerden a HB2 esta verificada en "edit hosts" pero HB1 NO.
por lo tanto HB1 no sufre cambios.

vamos a noip.com y verifiquen en Dynamic DNS que esto es así.
si se mandaron alguna cagada, vuelvan a repetir la configuración de HB1 y HB2 con el DUC
vuelvan a "**" mas arriba.


bien. ahora el cliente.
en game.h donde están los include agreguen estos


Code:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")

traten de que si ya esta, no se repitan
imagino que stdio.h ya debe estar

ahora tenemos que investigar sobre la pc del admin...
SUPONGAN:
si yo estoy levantando el servidor, tengo que saber el HOSTNAME LOCAL
para poder comparar con el cliente externo, y poder decidir
si usar ip local o internet. 

y para decidir si usar INTERNET mode o LAN mode
hay una manera fácil de hacerlo.

vamos a inicio, panel de control, sistema y seguridad, sistema.
bajamos un poquito y veremos algo que dice "nombre del equipo"
o bien "nombre completo del equipo".

no se que efecto tendra que esos dos sean distintos.
pero en mi pc son iguales. si no son iguales en las de uds, recomiendo entrar
a la configuración y ponerles nombres iguales.
TOMAMOS ESE NOMBRE
ejemplo: ADMIN_PC

vamos al globaldef.h
agreguen
Code:
#define DEF_SERVERHOSTNAME "ADMIN_PC"


busquen

Code:
if (bReadLoginConfigFile("login.cfg") == FALSE)



recomiendo borrar el if y el metodo completo bReadLoginConfigFile
y su declaracion en game.h

si no se animan, pongan el if entre /**/ para que el compilador 
lo ignore al momento del compilado.

abajo del cierre de ese if
agreguen
Code:
   char cipv4[16], cHostName[256], cHostName2[256];
   ZeroMemory(cHostName, sizeof(cHostName));
   if (gethostname(cHostName, 256) != 0)
   {   MessageBox(m_hWnd, "CAN NOT RESOLVE HOSTNAME", "ERROR", MB_ICONEXCLAMATION | MB_OK);
      return FALSE;
   }
   ZeroMemory(cHostName2, sizeof(cHostName2));
   memcpy(cHostName2, DEF_SERVERHOSTNAME, strlen(DEF_SERVERHOSTNAME));
   ZeroMemory(cipv4, sizeof(cipv4));
   
   ZeroMemory(m_cWorldServerAddr, sizeof(m_cWorldServerAddr));
   m_wLogServerPort = DEF_SERVER_PORT;

   if (memcmp(cHostName, cHostName2, 256) == 0)
   {   if (getDNSIP("HB1.ddns.net", DEF_SERVER_PORT, cipv4) != 0)
      {   MessageBox(m_hWnd, "CAN NOT RESOLVE SERVER DNS.","ERROR",MB_ICONEXCLAMATION | MB_OK);
         return FALSE;
      }
      memcpy(m_cWorldServerAddr, cipv4, strlen(cipv4));
      m_iGameServerMode = 1;
   }else
   {   if (getDNSIP("HB2.ddns.net", DEF_SERVER_PORT, cipv4) != 0)
      {   MessageBox(m_hWnd, "CAN NOT RESOLVE SERVER DNS.", "ERROR", MB_ICONEXCLAMATION | MB_OK);
         return FALSE;
      }
      memcpy(m_cWorldServerAddr, cipv4, strlen(cipv4));
      m_iGameServerMode = 2;
   }

la función gethostname va a calcular el HOSTNAME de la pc desde
la cual estoy ejecutando el cliente, ya sea la del admin q esta usando
para upear el servidor, o bien la de un cliente externo.
cHostName sera cargada con este HOSTNAME

cargo cHostName2 con el nombre de la pc del admin, para poder comparar
cHostName con cHostName2.

comparo ambos.
si son iguales, significa q el admin esta tratando de entrar desde la pc
donde upea el servidor por lo tanto es un LAN mode, y uso HB1
caso contrario, uso HB2, INTERNET mode.

vamos al final de game.cpp
agregamos
Code:
int CGame::getDNSIP(PCSTR dns, WORD wPort, char *cipa4)
{ char cPort[128];
 int iRet;
 struct addrinfo *result = nullptr;
 struct addrinfo hints;
 struct addrinfo *ptr = nullptr;
 struct sockaddr_in  *sockaddr_ipv4;
 
 memcpy(cipa4, "ERROR", 5);
 ZeroMemory(&hints, sizeof(hints));
 hints.ai_family = AF_UNSPEC;
 hints.ai_socktype = SOCK_STREAM;
 hints.ai_protocol = IPPROTO_TCP;
 ZeroMemory(cPort, sizeof(cPort));
 wsprintfA(cPort, "%lu", wPort);
 iRet = getaddrinfo(dns, cPort, &hints, &result);
 switch (iRet)
 { case 0:
 { for (ptr = result; ptr != nullptr; ptr = ptr->ai_next)
 switch (ptr->ai_family)
 { case AF_INET:
 { sockaddr_ipv4 = (struct sockaddr_in *)ptr->ai_addr;
 memcpy(cipa4, inet_ntoa(sockaddr_ipv4->sin_addr), 16);
 }
 break;
 }
 }
 break;
 }
 freeaddrinfo(result);
return iRet;
}

en game.h
Code:
int getDNSIP(PCSTR dns, WORD wPort, char *cipa4);

cosas a tener en cuenta:
la caducidad de los Servidores DNS.
el cambio de pc del servidor.

no se me ocurre ninguno mas.
si alguno ocurre, van a tener q compilar cliente nuevo.
otra cosa que no se, es si cuando caduca el S DNS les dejara poner el mismo nombre(HB1 y HB2)
mi cliente anda perfecto.

les recomiendo usar visual studio 2015 minimo.
Back to top Go down
 
CLIENT con DNS
Back to top 
Page 1 of 1

Permissions in this forum:You cannot reply to topics in this forum
Join Helbreath :: Open Source / Development Corner :: C++-
Jump to: