Bonjour.
Ce projet a été réalisé grâce à:
http://emmanuel-delahaye.developpez.com/reseaux.htm
http://vidalcharles.free.fr/lf/socket.html
et la msdn.
Cela fait maintenant un peu moins d'une semaine que j'ai commencé la programmation réseau grâce aux sockets.
Le client envoie du texte au serveur, et si data[0] == '1', alors le serveur est censé lancer internet explorer avec l'URL qui suit '1'.
Si data == '@', alors le client et le serveur se déconnectent.
Le problème est que lorsque que j'envoie, par exemple, "1www.clubic.com" depuis le client, la chaine de caractère data du serveur ne contient que "1www".
Je ne vois pas pourquoi toute la saisie n'est pas stockée dans data.
Le code source:
SERVEUR
main.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 #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include "serveur.h" int main(void) { int err, ret; WSADATA wsa_data; err = WSAStartup(MAKEWORD(2,2), &wsa_data); if(err) { fprintf(stderr, "WINSOCK2 non implemente"); getchar(); exit(EXIT_FAILURE); } puts("WINSOCK2: OK"); err = serveur(); WSACleanup(); if(err) ret = EXIT_FAILURE; else ret = EXIT_SUCCESS; getchar(); return ret; }
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 #include <stdio.h> #include <winsock2.h> #include "serveur.h" #define TELNET 23 #define AROBASE 64 #define INTERNET 49 int serveur(void) { int err = 0; SOCKET socket_1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(socket_1 != INVALID_SOCKET) { printf("Le socket %d du serveur est ouvert en mode TCP/IP \n", socket_1); { int sock_error; SOCKADDR_IN sin; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_family = AF_INET; sin.sin_port = htons(TELNET); sock_error = bind(socket_1, (SOCKADDR *)&sin, sizeof(sin)); if(sock_error != SOCKET_ERROR) { sock_error = listen(socket_1, 1); if(sock_error != SOCKET_ERROR) { printf("Ecoute du port %d \n", TELNET); printf("Attente de la connection d'un client sur le port %d \n", TELNET); { SOCKADDR_IN csin ; int recsize = (int) sizeof(csin); SOCKET client_sock = accept(socket_1, (SOCKADDR *)&csin, &recsize); if(client_sock != INVALID_SOCKET) { printf ("Client connecte avec le socket %d depuis %s:%d \n" ,client_sock ,inet_ntoa(csin.sin_addr) ,htons(csin.sin_port)); { int end = 0; do { char data[256] = ""; sock_error = recv(client_sock, data, (int) sizeof(data-1), 0); if(sock_error != SOCKET_ERROR) { data[sock_error] = 0; printf("%s", data); fflush(stdout); if(data[0] == AROBASE) { end = 1; } else if(data[0] == INTERNET) { char commande[275] = "start iexplore.exe"; data[0] = ' '; strcat(commande,data); system(commande); } } else { perror("socket.recv"); err = 1; end = 1; } }while(!end); } puts(""); closesocket(client_sock); printf("Le socket %d du client est ferme \n", client_sock); client_sock = INVALID_SOCKET; } else { perror("socket.accept"); err = 1; } } } else { perror("socket.listen"); err = 1; } } else { perror("socket.bind"); err = 1; } sock_error = closesocket(socket_1); printf("Le socket %d du serveur est ferme", socket_1); socket_1 = INVALID_SOCKET; if(sock_error) { perror("socket.close"); err = 1; } } } else { perror("socket.open"); err = 1; } return err; }
serveur.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifndef SERVEUR #define SERVEUR int serveur(void); #endif
CLIENT
main.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 #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include "client.h" int main(void) { int err, ret; WSADATA wsa_data; err = WSAStartup(MAKEWORD(2,2), &wsa_data); if(err) { fprintf(stderr, "WINSOCK2 non implemente"); getchar(); exit(EXIT_FAILURE); } puts("WINSOCK2: OK"); err = client(); WSACleanup(); if(err) ret = EXIT_FAILURE; else ret = EXIT_SUCCESS; getchar(); return ret; }
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
113
114
115 #include <stdio.h> #include <winsock2.h> #include "clean.h" #include "client.h" #define TELNET 23 #define AROBASE 64 int client(void) { int err = 0; SOCKET client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(client_sock != INVALID_SOCKET) { printf("Le socket %d est ouvert en mode TCP/IP \n", client_sock); { int sock_error; SOCKADDR_IN csin; csin.sin_family = AF_INET; csin.sin_port = htons(666); csin.sin_addr.s_addr = htonl(INADDR_ANY); sock_error = bind(client_sock, (SOCKADDR *)&csin, (int) sizeof(csin)); if(sock_error != SOCKET_ERROR) { char IP_serveur[16] = ""; SOCKADDR_IN sin; sin.sin_family = AF_INET; sin.sin_port = htons(TELNET); printf("Adresse IP du serveur: "); fgets(IP_serveur, sizeof(IP_serveur), stdin); clean(IP_serveur); sin.sin_addr.s_addr = inet_addr(IP_serveur); sock_error = connect(client_sock, (SOCKADDR *)&sin, (int) sizeof(sin)); if(sock_error != SOCKET_ERROR) { printf("Client connecte au serveur %s:%d avec le socket %d \n" , inet_ntoa(sin.sin_addr) , htons(sin.sin_port) , client_sock); { int end = 0; do { char data[256] = ""; fgets(data, sizeof(data), stdin); sock_error = send(client_sock, data, strlen(data), 0); if(sock_error != SOCKET_ERROR) { if(data[0] == AROBASE) { end = 1; } } else { perror("socket.send"); err = 1; end = 1; } }while(!end); } closesocket(client_sock); printf("Le socket %d du client est ferme, vous etes deconnecte du serveur \n", client_sock); client_sock = INVALID_SOCKET; } else { perror("socket.connect"); err = 1; } } else { perror("socket.bind"); err = 1; } } } else { perror("socket.open"); err = 1; } return err; }
clean.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 #include <stdio.h> #include <string.h> #include "clean.h" void clean(char data[]) { char *p_data = strchr(data, '\n'); if(p_data) { *p_data = 0; } else { int c; while((c = getchar()) != '\n'); } }
clean.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #ifndef CLEAN #define CLEAN void clean(char data[]); #endif
client.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifndef CLIENT #define CLIENT int client(void); #endif
Toute aide est la bienvenue.
Partager