Venez baraguiner avec la communauté !
Vous n'êtes pas identifié.
Pages: 1
Alors voila, je vais maintenant vous mettre le code source d'un serveur de base, trés simple en c (le code marche aussi en c++). Ce serveur ne fait qu'accepter une connexion et lorsqu'il recoit une trame, il la retransmet à tous les clients.
CODE :
#include <stdlib.h>
#include <winsock2.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h> //nécessite pthreadGC2.dll
#define PORT 8080 // Port arbitraire de communication
int tab[50]; // tableau d'entier permettant de stocker les numéros de socket des clients
int longtab;// entier indiquant le nombre de client
int end;// entier permettant de fermer le serveur
SOCKET sSock;
/**---------------[initialisation des winsock]---------------**/
void init()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
if (WSAStartup(wVersionRequested, &wsaData))
{
printf("Erreur WSAStartup \n") ;
system("PAUSE") ;
exit(1) ;
}
}
/**---------------[envoi de la trame à tous les clients]---------------**/
void EnvoiTousClient(char * buffer)
{
int i = 0;
for( i = 0 ; i < longtab ; i++ )
send(tab[i] , buffer , strlen(buffer) , 0);
}
/**---------------[méthode principale]---------------**/
int run(int sock)
{
char Buffer[500];
char tmp[500];
int i;
do
{
if(recv(sock, Buffer, 500, 0) != SOCKET_ERROR)
{
strcpy(tmp,Buffer);
EnvoiTousClient(Buffer);
for( i = 0 ; i<500 ; i++)
Buffer[i] = '\0';
printf(">%s\n",tmp);
}
}while(strcmp(tmp, "/quit") != 0);
return sock;
}
/**---------------[petit panel d'admin, en console]---------------**/
void thr_main( int fake )
{
int choix = 0;
int sortie = 0;
char Buff[500];
while (sortie == 0)
{
printf("\t\tPanel\n");
printf("1 - listage des clients\n");
printf("2 - fermeture du serveur\n");
printf("3 - send mess\n");
scanf("%d",&choix);
switch(choix)
{
case 1 : printf("il y a %d client\n", longtab);system("pause");system("cls");break;
case 2 : sortie = 1;end = 1; break;
case 3 : printf("trame a envoyer > ");scanf("%s" , Buff);EnvoiTousClient(Buff);break;
default :break;
}
}
}
int main()
{
int fromlen = sizeof(struct sockaddr_in);
int tSock;
int tmp;
init();
longtab = 0;
pthread_t thr;
end = 0;
sSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if( sSock!=INVALID_SOCKET )
{
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
sain.sin_addr.s_addr = INADDR_ANY;
if(bind(sSock, (struct sockaddr *) &sain, sizeof(struct sockaddr_in)) != SOCKET_ERROR)
{
if (listen(sSock, 1)!=SOCKET_ERROR)
{
pthread_create(&thr , NULL , thr_main , 0);
while(!end)
{
tab[longtab] = accept(sSock,(struct sockaddr *) &sain, &fromlen);
if(tab[longtab]==SOCKET_ERROR)
{
printf("erreur d'acceptation\n");
system("PAUSE") ;
closesocket(tab[longtab]);
}
tSock = pthread_create(&thr , NULL , run , tab[longtab]);
longtab++;
}
}
else
{
printf("ERREUR LISTEN \n");
system("PAUSE") ;
closesocket(sSock);
}
}
else
{
printf("erreur bind\n");
closesocket(sSock);
}
}
else
{
printf("ERREUR SOCKET\n");
}
int i;
if( end == 1)
{
for( i = 0 ; i < longtab ; i++ )
closesocket(tab[i]);
WSACleanup();
}
else
{
printf("un client nous quit, paix à son ame\n");
for( i = 0 ; tab[i] != tSock ; i++);
for( i ; i < longtab ; i++ )
tab[i] = tab[i+1];
longtab--;
closesocket(tSock);
}
return 1;
}
ATTENTION : CE CODE NE FONCTIONNE QUE SOUS WINDOWS, IL NECESSITE le dll du thread , ET PRENEZ EN COMPTE QUE J AI MODIFIER LE CODE AVANT DE VOUS LE TRANSMETTRE DONC IL N EST PAS TESTE (mais normalement il n'a pas de problemes)
en cas de soucis, laissez un message ou envoyez un mp !
Hors ligne
je mettrai bientot le code du client=)
Hors ligne
héhé ouai mais de toutes facons je dois le faire, j'ai un p2p à faire pour les cours ^^
Hors ligne
Pages: 1