| 12
 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
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 
 |  
#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
 
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( PF_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{
		fgets(msg, sizeof(msg), stdin);
		search(msg);
		send(client_id1, msg,sizeof(msg),0);
	}
	while(strcmp(msg,"exit")!=0);
	return NULL;
}
 
/*****************************************/
//	ENVOI RECEPTION SON	    //
/*****************************************/
void* flux_son_sent(void* arg){
 
	int client_id_son_out=0;
	struct thread_info *info=(struct thread_info *)arg;
	int socket_id_son_out=info->socket_tmp;
	char buf[128]="TEST envoi son serveur";
 
 
	if((client_id_son_out = accept((int)socket_id_son_out,NULL,0)) == -1){
		fprintf( stderr, "probleme avec accept son out \n" );
		exit( EXIT_FAILURE );
	}
	else{
		printf("Connexion serveur son OUT reussi sur socket %d\n",client_id_son_out);
		search(buf);
		send(client_id_son_out, buf,sizeof(buf),0);
	}
 
}
void* flux_son_recu(void* arg){
 
	int client_id_son_in=0;
	struct thread_info *info=(struct thread_info *)arg;
	int socket_id_son_in=info->socket_tmp;
	char buf[128] = "";
 
 
	if((client_id_son_in = accept((int)socket_id_son_in,NULL,0)) == -1){
		fprintf( stderr, "problème avec accept son in\n" );
		exit( EXIT_FAILURE );
	}
	else{
		printf("Connexion serveur son IN reussi sur socket:%d\n",client_id_son_in);
		recv(client_id_son_in, buf, sizeof(buf), 0);
		//printf("SON IN recep reussi->%s\n",buf);
	}
}
 
int main( int argc, char** argv ) {
	int socket_id,socket_id_son_in,socket_id_son_out,client_id;
	char buffer[128]= "";
	pthread_t thread,thread_son_in,thread_son_out;
	//permet le passage d'arguments aux threads
	struct thread_info *info;
	struct thread_info *info_in;
	struct thread_info *info_out;
	info = malloc(sizeof(struct thread_info));
	info_in = malloc(sizeof(struct thread_info));
	info_out = malloc(sizeof(struct thread_info));
 
	//SERVEUR TEXTE
	socket_id = create_tcp_server(2000,1);
	info->socket_tmp=socket_id;
	pthread_create(&thread, NULL, envoi,info);
 
	//SERVEUR SON OUT
	socket_id_son_out = create_tcp_server(2002,1);
	info_out->socket_tmp=socket_id_son_out;
	pthread_create(&thread_son_out, NULL, flux_son_sent,info_out);
 
	//SERVEUR SON IN
	socket_id_son_in = create_tcp_server(2001,1);
	info_in->socket_tmp=socket_id_son_in;
	pthread_create(&thread_son_in, NULL, flux_son_recu,info_in);
 
 
	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_son_in, 2 );
	close( socket_id_son_in );
	shutdown( socket_id_son_out, 2 );
	close( socket_id_son_out );
	shutdown( socket_id, 2 );
	close( socket_id );
	shutdown( client_id, 2 );
	close( client_id );
 
	pthread_cancel(thread);
	pthread_cancel(thread_son_in);
	pthread_cancel(thread_son_out);
 
	free(info);
	free(info_in);
	free(info_out);
 
	exit( EXIT_SUCCESS );
 
} | 
Partager