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