Bonjour à vous,
Je rencontre un souci avec mon programme supposé être un client basique UDP, usant des datagram sockets; le serveur fonctionne de manière analogue.

Dans le code qui suit, lors de l'exécution de la fonction send, je rencontre systématiquement l'erreur "invalid argument" pour la fonction sendto, sans obtenir un quelconque détail supplémentaire sur l'argument dont il est question (c'est d'ailleurs très classique dans ce genre de langages).

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
bool net_client::openLink(char* address, char* port)
{
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int s;
    //socklen_t addrlen;
 
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM; 
    hints.ai_flags = 0;
    hints.ai_protocol = 0;
    printf("I want to connect to %s:%s\n",address, port);
    s = getaddrinfo(address, port, &hints, &result);
    if (s != 0) {
        fprintf(stderr, "Unable to get address info: %s\n", gai_strerror(s));
        return false;
    }
 
 
    for (rp = result; rp != NULL; rp = rp->ai_next) {
      sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
      if (sfd == -1) continue;
 
      if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) // try....
	break; // the rp will so stay with a good one
 
      close(sfd); // close unused sockets
    }
 
    if(rp == NULL) { // no connection
      fprintf(stderr, "No connection\n");
      return false;
    } else {
      printf("Connected to %s\n",rp->ai_canonname);
      host = rp;
    }
    freeaddrinfo(result); //no longer needed
 
    this->isGut = true;
    this->clientThread = std::thread(&net_client::readLoop, this); // the read loop begins there
 
    return true;
 
}
 
bool net_client::send(char command)
{
  return (sendto(sfd, &command, 1, 0, (struct sockaddr*) host->ai_addr,host->ai_addrlen) != -1);
}
Pour rendre mon code compréhensible, je dois vous préciser que:
- j'ai créé une classe net_client, dont les fonctions désignées ci-dessus sont membres,
- cette classe net_client comporte également un membre struct addrinfo* host, un bool isGut qui autorise le reste du programme à se lancer une fois la connexion établie, et un int sfd représentant le socket.
- le thread dont il est question à la fin du code est là pour récupérer périodiquement des infos de la part du serveur (recvfrom), celui-ci renvoyant périodiquement (testé avec un client bidon) son statut à son (unique) client.

Je ne parviens pas à comprendre ce qui provoque l'erreur dans ce code: getaddrinfo semble fonctionner et renvoyer ce qu'il faut puisque écrire dans le socket avec write(...) fonctionne -i.e. le serveur reçoit les données-. Toutefois, je dois savoir ce qu'a donné l'écriture, et write ne renvoie pas d'erreur même lorsque le serveur est absent. Et, au-delà de cet intérêt pratique, j'ai lu que sendto était la méthode propre pour communiquer avec des datagram sockets.

SI vous avez des idées pour l'origine de l'erreur "invalid argument", je suis à votre écoute, et remercie par avance ceux qui prendront le temps de me répondre.

Bien cordialement,
CF.