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(“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 );
}