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 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
|
//serveur sous Linux
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
#define PORT 23
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define CLIENT_MAX 1000
struct vari
{
SOCKET s_server;
SOCKET s_client;
SOCKADDR_IN client;
char buffer[1024];
char buff[1024];
int n;
};
void* maFonction(void* data);
SOCKET s_global[CLIENT_MAX];
int index_s = 0;
int main(void)
{
int erreur = 0;
SOCKET s_server;
s_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s_server == INVALID_SOCKET)
fprintf(stderr, "La fonction socket a echoue.\n");
else
{
SOCKADDR_IN server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(PORT);
memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
fprintf(stderr, "La fonction bind a echoue.\n");
else
{
if (listen(s_server, 0) == SOCKET_ERROR) /* listen : commencer l'écoute */
fprintf(stderr, "La fonction listen a echoue.\n");
else
{
/* Création de l'ensemble de lecture */
fd_set readfs;
while (1)
{
/* On vide l'ensemble de lecture et on lui ajoute
la socket serveur */
FD_ZERO(&readfs);
FD_SET(s_server, &readfs);
/* On regarde si la socket serveur contient des
informations à lire */
if(FD_ISSET(s_server, &readfs))
{
/* Ici comme c'est la socket du serveur cela signifie
forcement qu'un client veut se connecter au serveur.
Dans le cas d'une socket cliente c'est juste des
données qui serons reçes ici*/
SOCKET s_client;
SOCKADDR_IN client;
int csize = sizeof(client);
s_client = accept(s_server, (SOCKADDR *)&client, &csize);
/* La , on stocke l'identifiant reçu */
s_global[index_s++] = s_client;
if (s_client == INVALID_SOCKET)
fprintf(stderr, "La fonction accept a echoue.\n");
else
{
char buffer[1024];
int n;
printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr));
strcpy(buffer, "Bonjour\n");
send(s_client, buffer, (int)strlen(buffer), 0);
n = recv(s_client, buffer, sizeof(buffer) - 1, 0);
pthread_t thread;
pthread_create(&thread, NULL, maFonction, &s_client);
}
}
}
}
}
}
return 0;
}
void* maFonction(void* data)
{
struct vari res;
res.s_client = *(int*)data;
while (1) //boucle de réception et d'envois
{
memset(res.buffer, '\0', sizeof(res.buffer));
res.n = recv(res.s_client, res.buffer, sizeof(res.buffer) - 1, 0);
printf("%s\n",res.buffer); // j'affiche le message
sprintf(res.buff, "%s", res.buffer); // je copie le "buffer" dans "buff"
/* Et la , on envoie à tous les clients ! */
int i;
for (i = 0; i < index_s; i++)
{
send (s_global[i], res.buff, (int)strlen(res.buff), 0); // envoie du buff
}
}
} |
Partager