[Socket] Erreur 22: Invalid argument
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:
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.
[Résolu] [Socket] Erreur 22: Invalid argument
Merci beaucoup! Effectivement ça venait de là. Je ne savais pas que freeaddrinfo libérait l'ensemble de la liste chaînée et non l'élément de tête....
Bonne après-midi!