Chat multithread

diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013 - 9 sept. 2012 à 23:54
diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013 - 10 sept. 2012 à 00:04
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 ![c

2 réponses

diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013
9 sept. 2012 à 23:56
voici les codes

Serveur

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include
#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 );}





Client


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include
#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 );

}
0
diagnebabacar0 Messages postés 8 Date d'inscription samedi 30 janvier 2010 Statut Membre Dernière intervention 2 juillet 2013
10 sept. 2012 à 00:04
serveur.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include 
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include 
#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 );}



client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include 
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include 
#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(&#8220;10.0.3.15&#8221;);
 /* 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 );
 
}
0
Rejoignez-nous