Bonjour à tous,
alors voila, je créé deux socket, une qui attend et lit, l'autre qui se connecte à la première et qui lui envoi le message.
Tous marche bien, ma socket se connecte à la première puis lui envoi le message que j'ai instancié à "coucou", la deuxième socket écoute et affiche la chaine de caractère envoyée.
Mon problème est que lorsque je quitte mon application qui écoute, la console plante, avec un jolie pop-up "Le programme à cessé de fonction" et je trouve cela franchement gênant mais si mon objectif principale qui était d'envoyer une chaine de caractère d'un PC à un autre est rempli.
Je ne sais pas pourquoi, je ne vois aucun problème dans mon code, le voici :
SOURCE écoute :
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #if defined (WIN32) // Verifie si l'OS est Windows ou un autre. #include <winsock2.h> typedef int socklen_t; #elif defined (linux) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(s) close(s) typedef int SOCKET; typedef struct sockaddr_in SOCKADDR_IN; typedef struct sockaddr SOCKADDR; #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #define PORT 23 int main(void) { #if defined (WIN32) WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,2), &WSAData); #else int erreur = 0; #endif SOCKET sock; SOCKADDR_IN sin; SOCKET csock; SOCKADDR_IN csin; char chaine[32] = "Bonjour !"; socklen_t recsize = sizeof(csin); int sock_err; /* Si les sockets Windows fonctionnent */ if(!erreur) { 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, sizeof(sin)); /* 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, &recsize); printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port)); /* Si l'on reçoit des informations : on les affiche à l'écran */ if(recv(csock, chaine, 300, 0) != SOCKET_ERROR) printf("Recu : %s\n", chaine); /* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */ shutdown(csock, 2); } } /* Fermeture de la socket */ printf("Fermeture de la socket...\n"); closesocket(csock); closesocket(sock); printf("Fermeture du serveur terminee\n"); } WSACleanup(); } /* On attend que l'utilisateur tape sur une touche, puis on ferme */ system("PAUSE"); return 0; }En attendant votre aide,
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
70
71
72
73
74
75
76
77 #if defined (WIN32) #include <winsock2.h> typedef int socklen_t; #elif defined (linux) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(s) close(s) typedef int SOCKET; typedef struct sockaddr_in SOCKADDR_IN; typedef struct sockaddr SOCKADDR; #endif #include <stdio.h> #include <stdlib.h> #define PORT 23 int main(void) { #if defined (WIN32) WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,2), &WSAData); int sock_err=0; #else int erreur = 0; #endif SOCKET sock; SOCKADDR_IN sin; char chaine[32] = "coucou"; /* Si les sockets Windows fonctionnent */ if(!erreur) { /* Création de la socket */ sock = socket(AF_INET, SOCK_STREAM, 0); /* Configuration de la connexion */ sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_family = AF_INET; sin.sin_port = htons(PORT); /* Si l'on a réussi à se connecter */ if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR) { printf("Connection à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port)); sock_err = send(sock, chaine, 300, 0); /* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */ shutdown(sock, 2); } /* sinon, on affiche "Impossible de se connecter" */ else { printf("Impossible de se connecter\n"); } /* On ferme la socket */ closesocket(sock); WSACleanup(); } /* On attend que l'utilisateur tape sur une touche, puis on ferme */ system("PAUSE"); return EXIT_SUCCESS; }
Cordialement,
GibsonSG_76
Partager