Bonjour à tous !
Alors, je commence par vous expliquer mon projet : je cherche à faire une application sur Iphone/Ipad ou une perssone fera un dessin et l'enverra aux appareils se trouvant à proximité et ayant rejoint la partie. (C'est en très gros)
Actuellement je cherche à faire une connection TCP serveur/client entre 2 appareils. Alors j'ai plusieurs questions et problèmes ^^
Tout d'abord peut on faire une connection TCP serveur/client sur des Iphone/Ipad via des sockets ? (Parce que si je me casse la tête depuis 3 jours sur un truc impossible voilà quoi :p )
Ensuite si oui j'aimerais comprendre pourquoi mon code ne fonctionne pas, je vous le met ici :
Code serveur :
Code 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 void connectionServ() { int erreur = 0; /* Socket et contexte d'adressage du serveur */ SOCKADDR_IN sin = { 0 }; SOCKET sock; socklen_t recsize = sizeof(sin); /* Socket et contexte d'adressage du client */ SOCKADDR_IN csin = { 0 }; SOCKET csock; socklen_t crecsize = sizeof(csin); int sock_err; if(!erreur) { /* Création d'une socket */ sock = socket(AF_INET, SOCK_STREAM, 0); /* Si la socket est valide */ if(sock != INVALID_SOCKET) { printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock); /* Configuration */ sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */ sin.sin_family = AF_INET; /* Protocole familial (IP) */ sin.sin_port = htons(PORT); /* Listage du port */ sock_err = bind(sock, (SOCKADDR*)&sin, recsize); /* Si la socket fonctionne */ if(sock_err != SOCKET_ERROR) { /* Démarrage du listage (mode server) */ sock_err = listen(sock, 5); printf("Listage du port %d...\n", PORT); /* Si la socket fonctionne */ if(sock_err != SOCKET_ERROR) { /* Attente pendant laquelle le client se connecte */ printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT); csock = accept(sock, (SOCKADDR*)&csin, &crecsize); if(csock == INVALID_SOCKET) { perror("accept()"); } printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port)); } else perror("listen"); } else perror("bind"); /* Fermeture de la socket client et de la socket serveur */ printf("Fermeture de la socket client\n"); closesocket(csock); printf("Fermeture de la socket serveur\n"); closesocket(sock); printf("Fermeture du serveur terminée\n"); } else perror("socket"); } }
Voilà donc quand je lance l'appli côté serveur sur un appareil, dans ma console j'obtiens bien ce qu'il faut :
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 void connectionCli(void) { SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) { perror("socket()"); exit(errno); } struct hostent *hostinfo = NULL; SOCKADDR_IN sin = { 0 }; /* initialise la structure avec des 0 */ const char *hostname = "localhost"; hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */ if (hostinfo == NULL) /* l'hôte n'existe pas */ { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */ sin.sin_port = htons(PORT); /* on utilise htons pour le port */ sin.sin_family = AF_INET; if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR) { printf("Echec du connect(), le code d'erreur est %d\n", errno); } else { printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port)); } closesocket(sock); }
"La socket 4 est maintenant ouverte en mode TCP/IP
Listage du port 23...
Patientez pendant que le client se connecte sur le port 23..."
Donc, le programme passe bien la création du socket, le bind et le list. Puis attend qu'un client arrive.
Ensuite, je lance mon appli côté client sur un deuxième appareil et j'obtiens :
"Echec du connect(), le code d'erreur est 61"
Donc le socket se crée correctement mais lors du connect -> Erreur.
J'ai plusieurs proposition pour ce qui peut poser problème :
- Le fait que ce soit des Iphone/Ipad
- Le fait que je lance l'appli côté serveur sur un Iphone et l'appli côté client sur un Ipad.
- Le fait que j'ai mis "localhost" en nom de domaine, mais j'ai essayer avec diverse combinaison :
- Domaine : "localhost", Port : 23
- Domaine : "localhost", Port : 8080
- Domaine : "developpez.net", Port : 23
J'ai aussi essayé de mettre une adresse IP directemen :
Suppression du code :
Et ajout du code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 struct hostent *hostinfo = NULL; const char *hostname = "localhost"; hostinfo = gethostbyname(hostname); /* on récupère les informations de l'hôte auquel on veut se connecter */ if (hostinfo == NULL) /* l'hôte n'existe pas */ { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
J'ai ici aussi essayé différentes adresse IP : "127.0.0.1", "192.168.0.1", "0.0.0.1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part sin.sin_addr.s_addr = inet_addr("127.0.0.1");
Mais rien n'a fonctionné ....
Si quelqu'un a la moindre idée, je suis preneur !
Partager