salut tout le monde
alors j'ai commencé depuis peu à vouloir créer un "chat" simple.
j'utilise donc les sockets qui marchent mais j'ai 2 questions ou plutôt 2 problèmes
1) je n'arrive pas bien à comprendre comment gérer les sockets "send" et "recv"...
Je m'explique. Dans le client je doit taper une phrase et l'envoyer sur le serveur qui lui même renvoi la phrase sur touts les clients qui sont connectés,
mais je ne sais pas comment mettre ça en place
j'avais pensé à : send(s, "%s : %s ", pseudo, chaine, 0); mais ça ne marche pas
puis ensuite il faut la commande pour que le serveur reçoive et renvoi cette chaine de caractères.
2) quand je fait se connecter un client au serveur ça marche mais discuter tout seul ça ne sera pas drôle donc lorsque que je lance 2x le client le premier marche et le serveur dit "l'ip xxxx vient de se connecter" mais pour le 2 ème c'est un écran noir... Car à mon avis le serveur ne reste pas à l'écoute
voici la source:
Client.C
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <string.h> #include <winsock2.h> static void purger(void) { int c; while ((c = getchar()) != '\n' && c != EOF) {} } static void clean (char *chaine) { char *p = strchr(chaine, '\n'); if (p) { *p = 0; } else { purger(); } } int main(int argc, char *argv[]) { char chaine[500]; char pseudo[30]; printf("inserez votre pseudo\n\n"); scanf("%s", &pseudo); printf("\n\nBienvenu %s\n", pseudo); getch(); system("CLS"); WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) fprintf(stderr, "La fonction WSAStartup a echoue.\n"); else { SOCKET s; s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) fprintf(stderr, "La fonction socket a echoue.\n"); else { SOCKADDR_IN server; server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_port = htons(5050); memset(&server.sin_zero, '\0', sizeof(server.sin_zero)); if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR) fprintf(stderr, "La fonction connect a echoue.\n"); else { char buffer[100]; int n; n = recv(s, buffer, sizeof(buffer) - 1, 0); if (n != SOCKET_ERROR) { buffer[n] = '\0'; printf("%s", buffer); while (1) { printf("\n%s : ", pseudo); fgets(chaine, sizeof chaine, stdin); clean(chaine); printf("%s : %s ",pseudo, chaine); // on enlevera cela pour remplacer par un "send" au serveur qui renverra le message à chaque client connecté if ( strcmp( chaine, "exit" ) == 0 ) { goto fin; // je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p } } fin: send(s, "Au revoir\n", (int)strlen("Au revoir\n"), 0); } shutdown(s, SD_SEND); } closesocket(s); } WSACleanup(); } return 0; }
Serveur.C
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
99
100
101
102
103
104
105
106
107
108
109 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <string.h> #include <winsock2.h> static void purger(void) { int c; while ((c = getchar()) != '\n' && c != EOF) {} } static void clean (char *chaine) { char *p = strchr(chaine, '\n'); if (p) { *p = 0; } else { purger(); } } int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) fprintf(stderr, "La fonction WSAStartup a echoue.\n"); else { SOCKET s_server; s_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s_server == INVALID_SOCKET) fprintf(stderr, "La fonction socket a echoue.\n"); else { SOCKADDR_IN server; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(5050); memset(&server.sin_zero, '\0', sizeof(server.sin_zero)); if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR) fprintf(stderr, "La fonction bind a echoue.\n"); else { if (listen(s_server, 0) == SOCKET_ERROR) /* listen : commencer l'ecoute */ fprintf(stderr, "La fonction listen a echoue.\n"); else { SOCKET s_client; SOCKADDR_IN client; int csize = sizeof(client); s_client = accept(s_server, (SOCKADDR *)&client, &csize); if (s_client == INVALID_SOCKET) fprintf(stderr, "La fonction accept a echoue.\n"); else { char buffer[500]; char chaine[500]; int n; printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr)); strcpy(buffer, "Bonjour\n"); send(s_client, buffer, (int)strlen(buffer), 0); n = recv(s_client, buffer, sizeof(buffer) - 1, 0); /* getch(); */ if (n != SOCKET_ERROR) { buffer[n] = '\0'; printf("%s", buffer); } closesocket(s_client); } } } closesocket(s_server); } WSACleanup(); } return 0; }
Partager