PROTOCOLE TCP/IP - CLIENT/SERVEUR - [C++] [GCC]

Utilisateur anonyme - 2 août 2002 à 14:40
LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 - 28 avril 2010 à 10:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/9951-protocole-tcp-ip-client-serveur-c-gcc

LiaGalanodel Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 29 juillet 2010 1
28 avril 2010 à 10:17
Vraiment bien ce code.
A essayer!
Merci ;)
cs_ayoub718 Messages postés 1 Date d'inscription dimanche 7 décembre 2008 Statut Membre Dernière intervention 12 décembre 2009
12 déc. 2009 à 01:40
merci bcp mé ilya des problemes avec dev++, les erreurs indique que qlq fonction ne fonctione pas?
cs_chabalou Messages postés 1 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 22 février 2008
22 févr. 2008 à 07:37
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 ... ^_^
djgamix Messages postés 2 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 29 janvier 2008
29 janv. 2008 à 23:31
re

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

comment puis-je trouver ces header et lib ?
cs_aketus Messages postés 3 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 29 janvier 2008
29 janv. 2008 à 10:12
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
djgamix Messages postés 2 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 29 janvier 2008
28 janv. 2008 à 22:03
Voila beau code sourcee!


par contre si quelqun pourais maider je copi et je colle le code source

dans dev c++ et ca me marque plusieurs erreur lors de la compilation me manke t-il des librairies aide SVP


sys/socket.h: No such file or directory
netinet/in.h: No such file or directory
sys/un.h: No such file or directory
In function `main':
storage size of 'servaddr' isn't known
AF_INET' undeclared (first use in this function)
(Each undeclared identifier is reported only once for each function it appears in.)
`SOCK_STREAM' undeclared (first use in this function)
`INADDR_ANY' undeclared (first use in this function)
Makefile.win [Build Error] [main.o] Error 1


!!voila toutes les erreurs!!

si quelqun pourait prendre un peut de son temp pour m'expliquer d'ou viennent ces erreurs ca me
serais d'une grande aide

merci de répondre
kerneltony95 Messages postés 152 Date d'inscription dimanche 22 janvier 2006 Statut Membre Dernière intervention 26 mars 2007
10 oct. 2006 à 03:40
oui bonne idée niko plus tard je ferai un server avec identification ^^
cs_aketus Messages postés 3 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 29 janvier 2008
15 juin 2006 à 16:14
Tiens j'ai fait une version multithreads, simple :



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

#include "pthread.h"


#define MAXLINE 4096
#define MASOCKET 2000
#define MAXTHREAD 10

int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t tics;

void *connexion (void *param);
void socket_connect (void);


int main(int argc, char **argv)
{
int numthread=0;
pthread_t thread[MAXTHREAD];

socket_connect();

while (1)
{ //boucle infinie, faut-il le preciser ? :oD
if (numthread < MAXTHREAD)
{
pthread_create(&thread[numthread], NULL, connexion, NULL);
printf("Thread Numéro %d\n",numthread+1);
}
else
{
printf("Nombre de thread maximum atteint\n");
while(1);
//exit(0);
}
numthread++;
}
exit(EXIT_SUCCESS);
}


/********************************************************************************/
/* Fonction de création de sockets */
/********************************************************************************/


void socket_connect (void)
{
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
}
//return 0;
}



/********************************************************************************/
/* Thread de connexion au client */
/********************************************************************************/


void *connexion (void *param)
{
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 ;)
}
//while(1){};
close(connfd);
pthread_exit (0);
}

Par contre ca prend 100% du proc donc avec des sleep dans chaque thread ca peut le faire mais c'est pas très beau.
Si quelqu'un à une meilleure idée?

Par contre lors de l'édition des liens il faut faire :
gcc -lpthread -o serveur-test serveur-test.o
Sinon ça passe pas.

Niko2012 si tu veut je t'envoi les sources et le make file qui va bien?

Aketus
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
14 juin 2006 à 11:46
Bonjour Aketus et merci pour le commentaire :)

Bien sûr, tu suppose bien, il suffit de threader la gestion des clients après leur connexion, pour faire du multi-client.
Il s'agit d'un exemple très simple pour illustrer la gestion des sockets en C++

Niko.
cs_aketus Messages postés 3 Date d'inscription mardi 13 juin 2006 Statut Membre Dernière intervention 29 janvier 2008
14 juin 2006 à 10:46
Pas mal ce code pour débuter avec les socket!

Par contre lors de la compilation il met :
serveur.c: In function ?main?:
serveur.c:31: warning: incompatible implicit declaration of built-in function ?exit?

Et en mettant #include <stdlib.h> ca va beaucoup mieux!!!

Par contre la question concernant la multi-connexion m'intéresse donc si quelqu'un à la réponse?
D'aprés le code il est mono connexion et lorsqu'il a donné l'heure il se remet en attente (boucle infinie)
Je suppose qu'il faudrait donc créer des threads.

Merci.
djwarrior28 Messages postés 2 Date d'inscription lundi 15 décembre 2003 Statut Membre Dernière intervention 1 février 2005
1 févr. 2005 à 15:26
le code est pas mal, cependant
INADDR_ANY ne signifie pas forecement que le srv va accepter une connection mais que tu n'as pas besoin de specifier une @ ip car cette fonction recupere automatiquement celle de ta machine srv
ilemporio Messages postés 1 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 28 janvier 2005
28 janv. 2005 à 15:43
est ce que ce source fonctionne avec Borland C++ Builder 6?
worms4 Messages postés 27 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 20 mars 2007
5 déc. 2004 à 18:39
j'ai limpression qu'il n'y a qu'avec moi que sa ne marche pas. Impossible de le compiler. J'utilise Dev C++ ca ne marche aps. Je l'ai test sous visual et par contre la c'est bon. Ne voulant pas coder sous visual j'ai pensser que ca venais des .h j'ai essayer de les changé avec ceux de visual et la toujour pas........ Aider moiiiiiiiiiiiiiiiiiiiiiiiiii svp
CptLuthor Messages postés 25 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 9 décembre 2004
13 nov. 2004 à 22:59
Salut

Quand on est conecté avec un pot client et moi server, peut t on se voir en réseau, c a d se voir dns les jeux par exemple ?

merci
byfrost Messages postés 1 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 22 juin 2004
22 juin 2004 à 19:39
salut
je voulais savoir si ton serveur pouvait accepter plusieurs clients a la fois ou si il naccepte qune seule connexion
Si non ke faudrait il modifier
c en fait pour ce servir de ton code pour faire un logiciel de Tchat
Merci d'avance
albator2004 Messages postés 3 Date d'inscription lundi 21 juin 2004 Statut Membre Dernière intervention 25 juin 2004
22 juin 2004 à 09:30
Bonjour!!

Voilà je recherche de la doc sur la manière de configurer une archi 3-tier avec quel langage de dev utiliser. (plus exmples ci-possibles...)

Merci à tous!

P.S C'est mon 1er post sur ce site.
cs_miky28 Messages postés 2 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 29 décembre 2004
12 juin 2004 à 15:20
salut a tous

J'aimerai savoir si c possible de faire la parti client en C++
si possible esseyer de me filler les commende que je devrait utiliser pour arriver a met fin

merci a tous
@++

ps: je suis un newbie de la mort qui tu donc allez y molo
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
23 mai 2004 à 13:16
Désolé, mais il n'a rien à faire ici..
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
26 avril 2004 à 02:05
ni le client ni le serveur ne doivent etre obligatoirement codés en C++
la communication se fait par le protocole TCP/IP, libre à toi ensuite de faire par exemple un équivalent du client en java. il faudra par contre faire attention au fait que tu ne pourras plus envoyer d'objets ou de classes sérialisées et les récupérer "directement" de l'autre coté: tu devras toi-meme gérer le 'decodage' des paquets recus..

pour lancer le serveur sur linux, il suffit de compiler la source et de l'exécuter... les librairies inclues sont celles de Linux justement..
cs_YaNn0u Messages postés 48 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 27 avril 2005
25 avril 2004 à 01:06
Salut,
Tout d'abord bravo pour ta source, elle est vraiment chouette !
Je voulais savoir si le client doit etre forcement coder en c/c++ pour pouvoir communiquer avec ton serveur ( car javais coder des salons en vb ou je suis un initié ce qui nest pas le cas en c++ ! )
De plus, peut-on lancer ce serveur sur un shell linux, si oui comment ?

Merci d'avance !
niko2013 Messages postés 1 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 24 janvier 2004
24 janv. 2004 à 18:00
Heu pareil que Narcissus, je voudrais bien pouvoir le compiler mais il ne reconnait pas les fichiers d'en tete... Je développe sous Dev CPP.

Merci d'avance !
GhostLord Messages postés 1 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 janvier 2004
7 janv. 2004 à 11:36
Pas mal le code!
Je recherche des exemples de programmes, sur les clients / serveurs pour un salon de discussion.
De préférence en O'Caml ou Java.
Merci.
derbiman10 Messages postés 11 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 9 février 2006
24 déc. 2003 à 03:47
je croit que pour les socket sous windows c'est c genre de truque a déclarer en plus mais il y a de bonne source ici sur les socket windows

#include <winsock.h> ou #include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

SOCKET socket;
SOCKADDR_IN sin;
WSADATA wsadata;

moi meme je debut en c++ mais je code sous linux avec les socket donc si je me trompe réctifier l'erreur
Entropede Messages postés 2 Date d'inscription samedi 21 juin 2003 Statut Membre Dernière intervention 13 novembre 2010
23 déc. 2003 à 05:11
Bravo ! Il y si longtemps que je cherche un code simple pour développer toutes sortes de choses. Et moi aussi je suis très intéressé de connaître les codes sources qui permette de créer ces socket sous windows. Je n'ai pas essayé encore, mais je le ferai sous DevCpp ce soir même :P.

Encore bravo Niko ! C'est surper fin de ta part !
octet70 Messages postés 1 Date d'inscription lundi 3 novembre 2003 Statut Membre Dernière intervention 12 novembre 2003
12 nov. 2003 à 13:31
oui moi c'est pareil avec visual !!! j'aimerais bien avoir les equivallances si qqun les connais .... je suis novice ;)
merci ++
cs_xenan Messages postés 20 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 29 avril 2008
19 oct. 2003 à 11:37
salut a tous!
g un ptit probleme sous VC++ 6.
il reconé pas <sys/types.h> é <sys/socket.h>
j'imagine ki ya leurs ekivalent ?
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
25 août 2003 à 21:19
yop! j'etais en vacances... ^_^
les fichiers d'entete sont ceux par defaut sous Linux... il existe des equivalents sous Windows..
cs_Narcissus Messages postés 15 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 9 avril 2008
11 juil. 2003 à 19:52
je n'ai encore rien reçu , merci
cs_Narcissus Messages postés 15 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 9 avril 2008
9 juil. 2003 à 20:15
salut, je suis un debutant en Socket et j'ai besoin des fichier d'en tete utilisés , merci
10/10
gooopil Messages postés 3 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 19 juillet 2004
17 juin 2003 à 13:42
Bien, très bien même. Je cherchais un code simple pour pouvoir dévelloper un truc simple, c'est exactement ce qu'il me fallait :D
cs_saibou Messages postés 2 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 8 janvier 2004
23 févr. 2003 à 12:16
salut tout le monde! j'ai beau chercher sur la toile un code source sur la programmation client/serveur + sockets en C++ avec gestion d'erreurs, trames ... j'en trouve pas!
Soyez généreux, quels sont les tuaux??
Merci d"avance
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
26 janv. 2003 à 21:48
Evidement c'est possible! tu remplaces 13 par 80 dans le serveur!! ;)
Ou alors tu ouvres le port que tu as déclaré sur ton firewall... c'est toi qui voit, en fonction de tes acces
cs_norton Messages postés 215 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 21 août 2011
26 janv. 2003 à 16:11
serai t il possible de crée un serveur qui communiquerai pas le port 80
pour qu il ne soit pas refusé par les firewall ?

merci
cs_norton Messages postés 215 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 21 août 2011
26 janv. 2003 à 16:11
serai t il possible de crée un serveur qui communiquerai pas le port 80
pour qu il ne soit pas refusé par les firewall ?

merci
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
13 janv. 2003 à 18:20
Bien sûr! Ya aucun problème :)
et si tu as des questions, tu n'hésites pas... tu veux faire quoi comme genre de serveur?
yacinek Messages postés 2 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 16 janvier 2003
13 janv. 2003 à 12:50
je voulais savoir si je pouvais utiliser se serveur sous visual c++ ?
il y aurais aucun problème?
Niko2012 Messages postés 17 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 22 janvier 2004
9 sept. 2002 à 11:32
salut pepet,
perror est tout simplement dans stdio.h ...
voila, bon code ^_^
cs_pepet Messages postés 34 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 21 janvier 2003
7 sept. 2002 à 22:09
c dans kel .h perror(...)?
Utilisateur anonyme
2 août 2002 à 14:40
Whah il est vraiment bien ton code !
Bon courage pour la suite ;)
J.M.G.R
Rejoignez-nous