Bonsoir,
Je code actuellement un chat en utilisant les sockets UDP de la SFML 2.3 (j'utilise l'UDP pour m'entrainer, pour pouvoir faire des jeux en multi en UDP).
Le problème que j'ai est que quand je lance mon programme, il marche très bien en réseau local, je lance le serveur, j'ajoute un client, le serveur le remarque, je peux ajouter plusieurs autres clients, envoyer des messages etc...
Mais quand j'essaye mon programme avec mon adresse ip publique, le serveur ne reçoit pas les informations des clients.
J'ai essayé le programme avec mon ip publique sans que le port du serveur ou celui du client ne soient redirigés, ça de ne marche pas, j'ai essayé avec les 2 ports redirigés et avec un des deux redirigés, ça ne marche pas non plus.
Voici mon code coté serveur :
std::map<unsigned short, sf::IpAddress> computerID;
int get_new_client(sf::UdpSocket *socket, sf::IpAddress clientIp, unsigned short clientPort)
{
//J'ajoute le nouveau dans ma map qui les stock tous
computerID[clientPort] = clientIp;
std::cout << "Nouveau client en ligne\n";
std::cout << "Nombre de personnes en ligne : " << computerID.size() << std::endl;
return 0;
}
int main()
{
char who;
std::cout << "Tapez 's' pour lancer le serveur, 'c' pour le client\n";
std::cin >> who;
//on lance le serveur ou le client
if (who != 's')
{
client();
return 0;
}
sf::UdpSocket socket;
sf::IpAddress ip = sf::IpAddress::getPublicAddress();
sf::IpAddress ipLocal = sf::IpAddress::getLocalAddress();
unsigned short port;
std::cout << "L'IP locale du serveur est : " << ipLocal << std::endl;
std::cout << "L'IP publique du serveur est : " << ip << std::endl;
//std::cout << "Connect server to port : ";
//std::cin >> port;
//J'initialise le port à 2000 avec un variable globale, servPort vaut 2000
//pour changer la valeur dans tous le code directement
port = servPort;
socket.bind(port);
bool done = false;
while (!done)
{
//boucle qui reçoit puis envoie le message à tous les autres pc stockés
sf::Packet packet;
sf::IpAddress tempIp;
unsigned short tempPort;
std::string str;
std::string name;
std::cout << "server ip : " << ip << " server port : " << port << std::endl;
std::map<unsigned short, sf::IpAddress>::iterator tempIterator;
std::cout << "je vais recevoir\n";
socket.receive(packet, tempIp, tempPort);
packet >> str >> name;
//si un client se connecte il evoie "je me connecte tmtc" donc on ajoute le pc à la map
if (std::strcmp(str.c_str(), "je me connecte tmtc") == 0)
{
get_new_client(&socket, tempIp, tempPort);
}
else
{
std::cout << name << " dit : " << str << std::endl;
for (tempIterator = computerID.begin(); tempIterator != computerID.end(); tempIterator++)
if (tempPort != tempIterator->first)
socket.send(packet, tempIterator->second, tempIterator->first);
packet.clear();
}
}
return 0;
}
Et coté client :
int my_receive(sf::UdpSocket *socket, std::string myname)
{
//Reçoit les packets et affiche
bool done = false;
while (!done)
{
std::string name;
sf::Packet packet;
std::string str;
std::string receivedStr;
sf::IpAddress tempIp;
unsigned short tempPort;
socket->receive(packet, tempIp, tempPort);
if (packet >> receivedStr >> name)
{
std::cout << "\r" << name << " : " << receivedStr << " " << std::endl;
std::cout << myname << " : ";
}
}
return (0);
}
//unsigned short servPort = 64363;
unsigned short servPort = 2000;
int client()
{
sf::UdpSocket socket;
sf::Packet firstPacket;
std::string name, strIp;
unsigned short port = 0;
unsigned short serverPort = servPort;
std::cout << "Entrez l'IP du serveur : ";
//J'entre l'ip (en dur pour l'instant pour aller plus vite)
//std::cin >> strIp;
strIp = "22.177.128.143"; //Ce n'est pas mon ip, c'est une ip d'exemple
sf::IpAddress serverIP(strIp);
std::cout << "Entrez le port auquel vous voulez vous connecter : ";
std::cin >> port;
//je choisis le port
socket.bind(port);
std::cout << "Choisissez un nom : ";
std::cin >> name;
std::string str = "je me connecte tmtc";
firstPacket << str << "test";
//j'affiche l'ip et le port pour verifier que c'est bon, ça l'est tjrs
std::cout << "server ip : " << serverIP << " server port : " << serverPort << std::endl;
//j'envoie un premier packet pour sauvegarder coté serveur le port et l'ip de ce client
socket.send(firstPacket, serverIP, serverPort);
bool done = false;
//dans le while j'envoie des packet (message et nom) et je reçoi en meme temps grace au thread
sf::Thread thread(std::bind(&my_receive, &socket, name));
thread.launch();
while (!done)
{
sf::Packet packet;
std::string str;
std::string receivedStr;
sf::IpAddress tempIp;
unsigned short tempPort;
std::cout << "\r" << name << " : ";
std::getline(std::cin, str);
if (str.length() > 0)
{
std::cout << "je suis client et je tente d'envoyer\n";
packet << str << name;
socket.send(packet, serverIP, serverPort);
std::cout << "je suis client et j'ai envoye\n";
packet.clear();
}
}
return 0;
}
Si vous avez un idée d'où ça peut venir...
PS : J'avais fait un programme qui utilisait le TCP qui lui marchait très bien avec mon ip publique ou locale.