Protocole tcp/ip - client/serveur - [c++] [gcc]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 73 703 fois - Téléchargée 35 fois

Contenu du snippet

Une fois le serveur lance, un client peut s'y connecter via TCP, le serveur lui renvoit l'heure courante et le client l'affiche. Le client prend comme argument l'ip du serveur. Si vous avez des remarques, des questions, des suggestions, elles sont bienvenues !

Source / Exemple :


///////////////////////// Client tcp - by Nik^o^ - ////////////////////////////

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <stdio.h>

#define MAXLINE         4096
#define MASOCKET        13
//socket habituellement utilise pour un daytime serveur
//si l'acces est refuse, essayer avec un socket > 1023 (ex: 1111)

int							
main(int argc, char **argv)
{
	int		sockfd, n;
	char		recvline[MAXLINE + 1];
	struct 	sockaddr_in	servaddr;

	if (argc != 2){
		perror("usage: a.out <IPaddress>");
		exit(1);				
//si le nombre de parametres n'est pas correct...

	}

	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){	
//la fonction socket cree un socket de flux (SOCK_STREAM)internet(AF_INET) 
//(incomprehensible en francais)(plus simplement : Internet stream socket).
//Renvoit un int pour identifier le socket plus tard (cf. read & connect)

		perror("socket error");		
		exit(1);
//si ca foire...
	}

	bzero(&servaddr, sizeof(servaddr));	
//on met toute la structure a 0
//on remplit la structure avec l'ip du serveur et le num de son port

	servaddr.sin_family = AF_INET;
	servaddr.sin_port   = htons(MASOCKET);
//htons: pour convertir le numero de port

	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
//inet_pton: convertit l'argument ASCII (Ex: 127.0.0.1) dans le bon format

		perror("inet_pton error");
		exit(1);
//de meme, si ca foire...
	}

	if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
//connect etablit la connection TCP avec le serveur specifie par la structure de
//l'adresse du socket pointe par le second argument

		perror("connect error");						
		exit(1);
//idem
	}

	while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
//lit la reponse du serveur et ecrit le resultat

		recvline[n] = 0;	
//null terminate

		if (fputs(recvline, stdout) == EOF){
			perror("fputs error");
			exit(1);
		}
	}

	if (n < 0){			
//s'il y a eu un probleme pendant la lecture...
		perror("read error");
		exit(1);
	}

	exit(0);
}

///////////////////////// Serveur tcp - by Nik^o^ - ////////////////////////////

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <stdio.h>

#define MAXLINE		4096
#define MASOCKET		13

int
main(int argc, char **argv)
{
	int				listenfd, connfd;
	struct sockaddr_in	servaddr;
	char				buff[MAXLINE];
	time_t			tics;

	if (	(listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
//meme chose que pour le client

		perror("socket error");						
		exit(1);
//et si ca foire !

	}

	bzero(&servaddr, sizeof(servaddr));
//meme chose que pour le client

	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY signifie que le serveur va accepter une connection 
//client sur n'importe-quelle interface

	servaddr.sin_port        = htons(MASOCKET);

//on lie le port du serveur au socket en remplissant la "internet socket 
//adresse structure" et en appellant bind
	if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){	
		perror("bind error");						
		exit(1);
//au cas ou...
	}

	if (listen(listenfd, 5) < 0){
//avec listen, le socket est converti en listening socket (ecoute)
//sur lequel les demandes de connections vont etre acceptees par le Kernel

		perror("listen error");
		exit(1);
//ca peut merder aussi ici
	}

	while (1){		//boucle infinie, faut-il le preciser ? :oD
		if (	(connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0){	
//accept retourne un "descripteur de connection" (connected descriptor) qui est
//utilise pour la communication avec le nouveau client. Un nouveau pour chaque client

			perror("accept error");		
			exit(1);	//et aussi ici
		}
		
	      tics = time(NULL);	
        	snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&tics));
//on recupere la date et l'heure
        	
		if (write(connfd, buff, strlen(buff)) < 0){	
//et on envoit le tout au client !

			perror("write error");
			exit(1);	//de meme ;)
		}

		close(connfd);
	}
}

Conclusion :


bon, ce code sera mis a jour en fonction de vos remarques. :o)

nouvelle version a venir : serveur en C et applet Java en client

A voir également

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
mercredi 3 mars 2010
Statut
Membre
Dernière intervention
29 juillet 2010
1
Vraiment bien ce code.
A essayer!
Merci ;)
Messages postés
1
Date d'inscription
dimanche 7 décembre 2008
Statut
Membre
Dernière intervention
12 décembre 2009

merci bcp mé ilya des problemes avec dev++, les erreurs indique que qlq fonction ne fonctione pas?
Messages postés
1
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
22 février 2008

Aketus, je reprend ton code pour un projet et je te remercie de l'avoir mis à disposition. Le truc est --forcément comme tu l'as souligné-- le problème de l'utilisation du cpu. Je ne m'y connais pas assez pour remedier à ce problème alors si quelqu'un trouve une solution ... ^_^
Messages postés
2
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
29 janvier 2008

re

mais sous Windows sa ne serais pas Winsock.h plutôt ?

comment puis-je trouver ces header et lib ?
Messages postés
3
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
29 janvier 2008

Je suppose que comme tu utilise dev c++ tu es sous windows?

Sous linux tu as un répertoire /usr/include/... qui contient les headers et /usr/lib/.. qui contient les libs.
Il doit donc y avoir un équivalent sous windows, fait donc unn recherche sur le fichier socket.h et si tu le trouves vérifie que le path est ajouté à dev c++ et sinon fait en sorte d'ajouter les libs et les headers. Mais je pense que ce sont des include de base donc je soupçonne une mauvaise configuration de ton IDE.

A+

Aketus
Afficher les 39 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.