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
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());
        }
    }
}
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
 
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;
    }
}
En local ce code fonctionne parfaitement et donne:
Client
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...
Server
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
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.

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.