EUREKA !
C'était bien cela... Foutu maxi firewall d'Amazon.
Bon ça m'étonnerait que ça arrive à quelqu'un d'autre mais on se sait jamais alors voici ma solution :
Le problème c'est que l'instance d'Amazon ne sait pas créer de socket tcp sur l'ip publique car elle n'y a pas accès directement. En effet quand on tape ifconfig on voit que les interfaces réseau configurées possèdent toutes des IP privées. Impossible d'y accéder de l'extérieur, c'est une sécurité. Sauf que si on met une IP privée dans le BIND_IP des Config des cores, le client ne pourra jamais s'y connecter (déco à la sélection des personnages).
Pour contourner cela, il faut que le serveur Metin2 créé des sockets sur l'IP privée mais transmette l'IP publique au client. Amazon se charge de la correspondance IP privée/publique, donc une socket ouverte sur une IP privée sera transmise sur l'IP publique et vice-versa.
Pour se faire il faut modifier les fichiers config.cpp et main.cpp des sources
Dans le fichier de config.cpp, on va récupérer les valeurs des IP publique/privée
TOKEN("bind_private_ip")
{
strlcpy(g_szInternalIP, value_string, sizeof(g_szInternalIP));
fprintf(stderr, "Reading private IP : %s\n", value_string);
strlcpy(g_szIPInterne, value_string, sizeof(g_szIPInterne));
}
TOKEN("bind_public_ip")
{
strlcpy(g_szPublicIP, value_string, sizeof(g_szPublicIP));
fprintf(stderr, "Reading public IP : %s\n", value_string);
strlcpy(g_szIPExterne, value_string, sizeof(g_szIPExterne));
}
Il faut bien sur configurer vos IP publiques/privées dans les fichier CONFIG des cores de chaque channel
BIND_PRIVATE_IP: XXX.XXX.XXX.XXX
BIND_PUBLIC_IP: XXX.XXX.XXX.XXX
Ici pour arrivez à récupérer les données des fichiers CONFIG. Le main.cpp va pouvoir y avoir accès quand il appelera le config_init.
Dans le main.cpp il faut créer les socket tcp sur les IP privées (si elles existent)
Cherchez la ligne
if ((tcp_socket = socket_tcp_bind(g_szPublicIP, mother_port)) == INVALID_SOCKET)
Et remplacez l'intégralité de la condition comme suit
if ((tcp_socket = socket_tcp_bind(*g_szInternalIP ? g_szInternalIP : g_szPublicIP, mother_port)) == INVALID_SOCKET)
{
fprintf(stderr, "Invalid IP %s", *g_szInternalIP ? g_szInternalIP : g_szPublicIP, mother_port);
perror("socket_tcp_bind: tcp_socket");
return 0;
}
Même chose avec la ligne
if ((p2p_socket = socket_tcp_bind(g_szPublicIP, p2p_port)) == INVALID_SOCKET)
Remplacez comme suit
if ((p2p_socket = socket_tcp_bind(*g_szInternalIP ? g_szInternalIP : g_szPublicIP, p2p_port)) == INVALID_SOCKET)
{
perror("socket_tcp_bind: p2p_socket");
return 0;
}
Compilez, remplacez le game et on est bon !