hazaki | Bonjour,
Merci pour la réponse, c'était en effet dommage de bloquer sur quelque chose qui fonctionnait ^^.
Par la suite je vais donc essayer de créer la socket de data avec la fonction suivante :
Code :
- int connexionServeur(char * PORT)
- {
- // structure pour faire la demande de port
- struct addrinfo hints;
- // structure pour stocker et lire les résultats
- struct addrinfo *result, *rp;
- // socket d'attente (s) et de discution (t)
- int t, s=-1;
- // structures pour stocker les info concernant le client
- struct sockaddr_storage peer_addr;
- socklen_t peer_addr_len = sizeof(peer_addr);
- // variables pour tester si les fonctions donnent un résultats ou une erreur
- int res;
- int bon;
- // Des variable pour contenir de adresse de machine et des numero de port afin de les afficher
- char hname[NI_MAXHOST], sname[NI_MAXSERV];
-
- // on rempli la structure hints de demande d'adresse
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC; /* IPv4 ou IPv6 */
- hints.ai_socktype = SOCK_STREAM; /* socket flux connectée */
- hints.ai_flags = AI_PASSIVE; /* Les signifie que toutes les addresse de la machine seront utilisée */
- hints.ai_protocol = 0; /* Any protocol */
- hints.ai_addrlen = 0;
- hints.ai_addr = NULL;
- hints.ai_canonname = NULL;
- hints.ai_next = NULL;
- // on effectue la demande pour le port PORT défini par "8888"
- res = getaddrinfo(NULL, PORT, &hints, &result);
- if (res != 0) { // c'est une erreur
- fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(res));
- exit(1);
- }
-
- // si res = 0 le véritable résultat de la fontion est l'argument result
- // qui contient une liste d'addresse correspondant à la demande on va les
- // rester jusqu'a trouver une qui convien
- rp = result;
- bon = 0;
- while (rp != NULL) { // on parcourt la liste pour en trouver une qui convienne
- int yes = 1;
- s = socket(rp->ai_family, rp->ai_socktype,rp->ai_protocol);
- // si le résultat est -1 cela n'a pas fonctionné on recommence avec la prochaine
- if (s == -1) {
- perror("Création de la socket" );
- rp = rp->ai_next;
- continue;
- }
-
- res = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes,
- sizeof(int));
- if (res == -1) {
- perror("setsockopt" );
- rp = rp->ai_next;
- continue;
- }
- // si la socket a été obtenue, on essaye de réserver le port
- res = bind(s, rp->ai_addr, rp->ai_addrlen);
- if (res == 0 ) {// cela a fonctionné on affiche l'information
- bon = 1;
- // on récupère des informations affichables
- res = getnameinfo(rp->ai_addr, rp->ai_addrlen,
- hname, NI_MAXHOST,
- sname, NI_MAXSERV,
- NI_NUMERICSERV|NI_NUMERICHOST);
- if (res != 0) {
- fprintf(stderr, "getnameinfo: %s\n", gai_strerror(res));
- exit (1);
- }
- printf ("La socket %d est maintenant en attente sur l'adresse %s le port %s\n",
- s, hname, sname);
- break;
- }
- else { // sinon le bind a été impossible, il faut fermer la socket
- perror("Imposible de réserver l'adresse" );
- close (s);
- }
- rp = rp->ai_next;
- }
- if (bon == 0) { // Cela n'a jamais fonctionné
- fprintf(stderr, "Impossible de faire un bind\n" );
- exit(1);
- }
-
- // on libère la structure devenue inutile
- freeaddrinfo(result);
- // ######################################################
- // (2.2) Attente de connexion
- // ######################################################
- res = listen (s, 5);
- if (res < 0) {
- perror("listen" );
- close(s);
- exit(1);
- }
- // ######################################################
- // (4) Acceptation d'une connexion
- // Le serveur accepte l'une des demandes arrivées depuis le listen ou
- // attend s'il n'y en a pas
- // ######################################################
- t = accept (s, (struct sockaddr *)&peer_addr, &peer_addr_len);
- // s : la socket d'attente
- // peer_addr : la structure où on va stocker les infos
- // sur le client
- // peer_addr_len : donnée = la taille de tadr (pour
- // éviter le dépassement)
- // t : La socket qui servira pour la
- // discution
- if (t == -1) { // il y a eu une erreur
- perror("accept" );
- close (s);
- exit(1);
- }
- res = getnameinfo((struct sockaddr*)&peer_addr, peer_addr_len,
- hname, NI_MAXHOST,
- sname, NI_MAXSERV,
- NI_NUMERICSERV);
- if (res != 0) {
- fprintf(stderr, "getnameinfo: %s\n", gai_strerror(res));
- exit (1);
- }
- printf ("La socket %d a eu un client depuis %s sur le port %s\n",
- s, hname, sname);
- return(s);
- }
|
Le problème est que je bloque sur "La socket 4 est maintenant en attente sur l'adresse 0.0.0.0 le port 1030".
Ce code m'a été donné dans l'énnoncé de mon tp, je pense donc qu'il est juste, je ne vois pas pourquoi la connexion bloque sur la fonction accepte.
De plus le fait qu'on essaye de se connecter sur l'addresse 0.0.0.0 m'étonne mais quand je la remplace par mon adresse, le problème persiste.
Voilà où je l'appelle :
Code :
- envoieMessage(socketClient,"PORT 109,212,179,190,4,6\n" );
- nblus=recv(socketClient,buf,TAILLE_BUFF,0);
- if(nblus==0)
- {
- printf("Erreur de reception de message\n" );
- return -1;
- }
- buf[nblus]='\0';
- printf("%s",buf);
- connexionServeur("1030" );
|
Merci |