Bonjour,
je travaille sur le multijoueur d'un jeu, mais je gère le réseau avec des sockets UDP.
Je cherche un moyen pour que le client n'ai pas a ouvrir de port manuellement, comme quand on utilise un socket TCP.
Ma première question est donc: est-il possible de faire cela juste avec une socket UDP?
J'ai tenté d'utiliser un port automatiquement délivré par l'OS (en donnant 0 a socket.bind) mais cela ne fonctionne pas:
Client
Server
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 void runClient() { printf("Run client...\n"); od::SocketUdp socket; if(socket.bind(0) != socket.Done) { exit(2); } printf(">%u\n", socket.getLocalPort()); // 1. Send message to server od::StreamData packet; packet << std::string("Hello World"); if(socket.send(packet, SERVER_IP, SERVER_PORT) != socket.Done) { exit(1); } // 2. Get response while(true) { printf("Waiting for response...\n"); od::IPAddress remote_address; unsigned short remote_port; od::StreamData packet; if(socket.receive(packet, remote_address, remote_port) == socket.Done) { std::string str; packet >> str; printf("[%s:%u] %s\n", remote_address.toString().c_str(), remote_port, str.c_str()); } } }
En local ce code fonctionne parfaitement et donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 void runServer() { printf("Run server...\n"); od::SocketUdp socket_send; od::SocketUdp socket_receive; if(socket_receive.bind(7777) != socket_receive.Done) { exit(1); } while(true) { printf("Waiting for message...\n"); od::IPAddress remote_address; unsigned short remote_port; od::StreamData packet; if(socket_receive.receive(packet, remote_address, remote_port) == socket_receive.Done) { std::string str; packet >> str; printf("[%s:%u] %s\n", remote_address.toString().c_str(), remote_port, str.c_str()); printf("Send response\n"); od::StreamData packet; packet << std::string("Hello World"); socket_send.send(packet, remote_address, remote_port); } else break; } }
Client
Server
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Run client... >1369 Waiting for response... [192.168.0.12:1370] Hello World Waiting for response...
En online le serveur reçoit bien le message, mais quand il répond au client, le client ne reçoit jamais de réponse.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Run server... Waiting for message... [192.168.0.12:1369] Hello World Send response
Est ce que je me suis trompé ou/et mal compris quelque chose, ou est ce impossible de cette manière?
Si cela n'est pas possible en tant que tel, comment est-ce que je dois procéder?
Merci d'avance.
Partager