j essai de faire un chat simple en utilisant des threads ! le probléme c est que le programme n arrive pas a s exécuter et on me signal des erreur sur le serveur et notamment sur le client !
serveur.cclient.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 <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <pthread.h> #include <fcntl.h> #include <sys/ioctl.h> #define SIZE 10000 #define port 1000 struct thread_info{ int socket_tmp;} int create_tcp_server( int port, int nb_max_clients ) { int socket_id; int optval = 1; struct sockaddr_in sockname; //On établi la connexion if( -1 == (socket_id = socket( AF_INET, SOCK_STREAM, 0 ) ) ) { fprintf( stderr, "problème création socket\n" ); exit( EXIT_FAILURE ); } setsockopt( socket_id, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof( int ) ); memset( (char*)&sockname, 0, sizeof( struct sockaddr_in ) ); /* Bind socket to a port */ sockname.sin_family = AF_INET; /* Internet address family */ sockname.sin_port = htons( port ); /* Local port */ sockname.sin_addr.s_addr = htonl( INADDR_ANY );/* Any incoming interface */ if( (bind( socket_id, (struct sockaddr*)&sockname, sizeof(struct sockaddr_in))) == -1) { fprintf( stderr, "problème avec bind\n" ); exit( EXIT_FAILURE ); } /* Set socket to listen : Mark the socket so it will listen for incoming connections */ if((listen(socket_id,nb_max_clients)) == -1) { fprintf( stderr, "problème avec listen\n" ); exit( EXIT_FAILURE ); } return socket_id; } static void search(char *chaine){ char *p = strchr(chaine, '\n'); if (p) *p = 0; } static void* envoi(void* arg){ char msg[32]=""; short int client_id1=0; struct thread_info *info=(struct thread_info *)arg; int socket_id=info->socket_tmp; if((client_id1 = accept((int)socket_id,NULL,0)) == -1) { fprintf( stderr, "problème avec accept\n" ); exit( EXIT_FAILURE ); } do{ printf ("Client1 %s\n >", inet_ntoa(sockname.sin_addr.s_addr)); fgets(msg, sizeof(msg), stdin); search(msg); send(client_id1, msg,sizeof(msg),0); } while(strcmp(msg,"exit")!=0); return NULL; } int main( int argc, char** argv ) { int socket_id,client_id; char buffer[128]= ""; pthread_t thread; //permet le passage d'arguments aux threads struct thread_info *info; info = malloc(sizeof(struct thread_info)); //SERVEUR TEXTE socket_id = create_tcp_server(1000,4); info->socket_tmp=socket_id; pthread_create(&thread, NULL, envoi,info); if((client_id = accept(socket_id,NULL,0)) == -1){ fprintf( stderr, "probleme avec accept texte\n" ); exit( EXIT_FAILURE ); } else{ printf("Connexion serveur texte reussi sur socket %d\n",client_id); while(recv(client_id,buffer, sizeof(buffer),0)){ printf("Stranger: %s\n", buffer); } } // 0, pour fermer la socket en réception, 1, en émission, 2 dans les deux sens. shutdown( socket_id, 2 ); close( socket_id ); shutdown( client_id, 2 ); close( client_id ); pthread_cancel(thread); free(info); exit( EXIT_SUCCESS );}
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <pthread.h> #include <fcntl.h> #include <sys/ioctl.h> #define port 1000 #define SIZE 10000 struct thread_info{ int socket_tmp; }; int create_tcp_client( const char* hostname, int port ) { struct hostent* host_address; struct sockaddr_in sockname; int optval; int socket_id; if( NULL == ( host_address = gethostbyname( hostname ) ) ) { fprintf( stderr, "machine %s inconnue\n", hostname ); return( EXIT_FAILURE ); } /* Create a reliable, stream socket using TCP */ if( -1 == ( socket_id = socket( AF_INET, SOCK_STREAM, 0 ) ) ) { fprintf( stderr, "création de socket impossible\n" ); return( EXIT_FAILURE ); } optval = 1; setsockopt(socket_id, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int) ); /*Establish connection*/ sockname.sin_family = host_address->h_addrtype; sockname.sin_addr.s_addr = inet_addr(10.0.3.15); /* l'adresse se trouve dans le champ h_addr de la structure host_adress */ sockname.sin_port = htons( port );/* Server port */ memcpy( (char*)&(sockname.sin_addr.s_addr), host_address->h_addr, host_address->h_length ); if((connect( socket_id, (struct sockaddr*)&sockname, sizeof(struct sockaddr_in)))==-1) { fprintf( stderr, "connexion impossible socket au server %s\n", hostname ); return( EXIT_FAILURE ); } return socket_id; } static void search(char *chaine){ char *p = strchr(chaine, '\n'); if (p) *p = 0; } void* recep(void* socket_id){ char buffer[64] = ""; int socket_id1 = create_tcp_client( "localhost", 1000 ); while(recv(socket_id1,buffer, sizeof(buffer), 0)) printf("Stranger: %s\n", buffer); return 0; } int main( int argc, char** argv ) { int socket_id=0; char msg[128]=""; pthread_t thread; struct thread_info *info; //permet le passage d'arguments aux threads info = malloc(sizeof(struct thread_info)); //SOCKET TEXTE socket_id = create_tcp_client( "localhost", 2000); info->socket_tmp=socket_id; pthread_create(&thread, NULL, recep, info); //ENVOI DE TEXTE do{ fgets(msg, sizeof(msg), stdin); search(msg); send(socket_id, msg,sizeof(msg),0); } while(strcmp(msg,"exit")!=0); //On ferme les threads pthread_cancel(thread); //On ferme les sockets shutdown( socket_id, 2 ); close( socket_id ); free(info); exit( EXIT_SUCCESS ); }
Partager