IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

[Reseau] probleme client/serveur TCP LInux


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut [Reseau] probleme client/serveur TCP LInux
    Bonjour, lors d'un cours on a du faire l'exemple suivant :
    Client TCP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    /**************************
    **********CLIENT TCP******
    ***************************/
     
    #include<errno.h>
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
     
    #define PORTS 2058;
     
    int Construit_Adresse(struct sockaddr_in *adresse)
    {
    	adresse->sin_family=AF_INET;
    	adresse->sin_port=PORTS;
    	adresse->sin_addr.s_addr=htonl(INADDR_ANY);
    }
     
    int Construit_Adresse_Serveur(struct sockaddr_in *adresse)
    {
    	adresse->sin_family = AF_INET;
    	adresse->sin_port =PORTS;
    	adresse->sin_addr.s_addr = inet_addr("127.0.0.1");
    }
     
    int main(int argc, char *argv) 
    {
    	struct hostent *h;
    	struct sockaddr_in adr_s,adr_c;
    	char buf[20];
    	int sock;
    	/* Création socket */
    	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    	/* Attachement socket */
    	Construit_Adresse(&adr_c);
    	bind(sock,(struct sockaddr *) &adr_c, sizeof(adr_c));
    	Construit_Adresse_Serveur(&adr_s);
    	write(sock,"Test de connexion",20);
    	close (sock);
    }
    et Serveur TCP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /**************************
    **********SERVEUR TCP******
    ***************************/
     
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
     
    #define PORTS 2058;
     
    int Construit_Adresse(struct sockaddr_in *adresse)
    {
    	adresse->sin_family=AF_INET;
    	adresse->sin_port=PORTS;
    	adresse->sin_addr.s_addr=htonl(INADDR_ANY);
    }
     
    int main() 
    {
    	int namelen, sock,nsock;
    	char buf[20];
    	struct sockaddr_in adr_s,adr_c;
    	int lg;
    	pid_t pid;
     
    	/* Création socket */
    	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    	/* Attachement socket */
    	Construit_Adresse(&adr_s);
    	bind(sock,(struct sockaddr *) &adr_s, sizeof(adr_s));
    	listen (sock,5);
     
    	while (1)
    	{
    		lg= sizeof(adr_c);
    		nsock = accept(sock,(struct sockaddr *) &adr_c, &lg);
    		pid=fork();
    		if (pid ==0)
    		{
    			close(sock);
    			read(nsock,buf,20);
    			printf("Chaine recue : %s\n", buf);
    			close(nsock);
    			exit(0);
    		}
    	}
    }
    Mon probleme est que lorsque je lance le serveur puis le client rien ne se passe sur le serveur !!!

    On a fait un exmple en UDP et la sa fonctionne !! quelqu'un pourrait t'il m'aider sur mon erreur ??

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par jmjmjm
    Mon probleme est que lorsque je lance le serveur puis le client rien ne se passe sur le serveur !!!

    On a fait un exmple en UDP et la sa fonctionne !! quelqu'un pourrait t'il m'aider sur mon erreur ??
    Il faudrait d'abord résoudre tous ces warnings...

    En compilant avec :
    -Wall -Wextra -O2
    Citation Envoyé par Client
    client.c: In function ‘Construit_Adresse_Serveur’:
    client.c:25: warning: implicit declaration of function ‘inet_addr’
    client.c: At top level:
    client.c:29: warning: second argument of ‘main’ should be ‘char **’
    client.c: In function ‘main’:
    client.c:40: warning: implicit declaration of function ‘write’
    client.c:41: warning: implicit declaration of function ‘close’
    client.c:32: warning: unused variable ‘buf’
    client.c:30: warning: unused variable ‘h’
    client.c:28: warning: unused parameter ‘argc’
    client.c:28: warning: unused parameter ‘argv’
    client.c: In function ‘Construit_Adresse’:
    client.c:19: warning: control reaches end of non-void function
    client.c: In function ‘Construit_Adresse_Serveur’:
    client.c:26: warning: control reaches end of non-void function
    client.c: In function ‘main’:
    client.c:42: warning: control reaches end of non-void function
    Citation Envoyé par Serveur
    serv.c: In function ‘main’:
    serv.c:38: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
    serv.c:39: warning: implicit declaration of function ‘fork’
    serv.c:42: warning: implicit declaration of function ‘close’
    serv.c:43: warning: implicit declaration of function ‘read’
    serv.c:46: warning: implicit declaration of function ‘exit’
    serv.c:46: warning: incompatible implicit declaration of built-in function ‘exit’
    serv.c:22: warning: unused variable ‘namelen’
    serv.c: In function ‘Construit_Adresse’:
    serv.c:18: warning: control reaches end of non-void function
    Jc

    PS: Tu essayeras aussi connect à la place de bind du côté du client... Cela fonctionne mieux sous TCP

  3. #3
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut,
    Pas de doute le programme a besoin de débug. C'est probablement le but de l' exercice.

    En outre Construit_Adresse() a besoin d' attention: non seulement il n' y a pas besoin de pousser une structure sur le stack juste pour remplir 3 variables, mais encore elle n'est appelée qu'une fois -modularité injustifiée- et pire que tout elle remplit les champs "comme un port". Du coup je n'ai pas encore regardé le code du client.

    Tout ceci en plus de ce qu'a pointé fearyourself. Si ça compilait proprement ça serait déjà pas mal.
    Y a du boulot il a l' air bien cet exercice ...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lunixinclar
    En outre Construit_Adresse() a besoin d' attention: non seulement il n' y a pas besoin de pousser une structure sur le stack juste pour remplir 3 variables,
    Je ne vois pas trop le problème. C'est fait avec un pointeur de structure, ce qui est la Bonne Méthode.
    mais encore elle n'est appelée qu'une fois -modularité injustifiée- et pire que tout elle remplit les champs "comme un port".
    Jeu de mot involontaire (porc ?). Ca allège la lecture du code, ce qui n'est pas si mal...

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jmjmjm
    Bonjour, lors d'un cours on a du faire l'exemple suivant :
    Client TCP
    Mais c'est quoi ça ?
    Pour bricoler les sockets, il faut connaitre le C un minium quand même...

    Et pourquoi un S à PORT ?

    Pour le reste, c'est une catastrophe. Tu programmes au hasard. Dans un client, il n'y a pas d'"adresse client", ça se fait tout seul. Seule l'adresse du serveur compte... Il faut comprendre ce que tu fais, sinon tu fais n'importe quoi... De plus, le code n'est pas conforme à POSIX.1 (c'est pas write(), mais send() etc.) et tu prétends avoir fait ça en UDP ? avec un write() ? Arf !

    Une modeste initiation au réseaux et au sockets. A la fin de l'article, un lien vers un cours complet.

    http://emmanuel-delahaye.developpez.com/reseaux.htm

  6. #6
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    Non non je ne me suis pas servi de ce code pour l'UDP !! c'etait un autre programme!!

    Apres j'ai en effet oublié la fonction connect() coté client maintenant ca marche !!

    Je ne sais pas si le programme est catastrophique mais moi j'avais un programme a trou ou je devais juste cree une fonction Construit_Adresse()
    d'ou l'utilité d'avoir une fonction appellée qu'une fois
    pareil pour Construit_Adresse_Serveur.

    pour le coté exercice c'est donc fini mais par contre je veux bien quelque conseil :
    our le reste, c'est une catastrophe. Tu programmes au hasard. Dans un client, il n'y a pas d'"adresse client", ça se fait tout seul. Seule l'adresse du serveur compte... Il faut comprendre ce que tu fais, sinon tu fais n'importe quoi... De plus, le code n'est pas conforme à POSIX.1 (c'est pas write(), mais send() etc.) et tu prétends avoir fait ça en UDP ? avec un write() ? Arf !
    pour passer au norme et pas faire des truc qui serve pas (Seule l'adresse du serveur compte)

  7. #7
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    j'ai donc corrigé mon client de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /**************************
    **********CLIENT TCP******
    ***************************/
     
    #include<errno.h>
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
     
    #define PORTS 2058;
     
    int Construit_Adresse(struct sockaddr_in *adresse)
    {
    	adresse->sin_family=AF_INET;
    	adresse->sin_port=PORTS;
    	adresse->sin_addr.s_addr=htonl(INADDR_ANY);
    }
     
    int Construit_Adresse_Serveur(struct sockaddr_in *adresse)
    {
    	adresse->sin_family = AF_INET;
    	adresse->sin_port =PORTS;
    	adresse->sin_addr.s_addr = inet_addr("127.0.0.1");
    }
     
    int main(int argc, char *argv) 
    {
    	struct hostent *h;
    	struct sockaddr_in adr_s,adr_c;
    	char buf[20];
    	int sock;
    	/* Création socket */
    	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    	/* Attachement socket */
    	Construit_Adresse(&adr_c);
    	bind(sock,(struct sockaddr *) &adr_c, sizeof(adr_c));
    	Construit_Adresse_Serveur(&adr_s);
    	connect (sock, &adr_s, sizeof(adr_s));
    	write(sock,"Test de connexion",20);
    	close (sock);
    }
    Si j'ai compris tes conseil Emmanuel Delahaye je peux virer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Construit_Adresse(&adr_c);
    	bind(sock,(struct sockaddr *) &adr_c, sizeof(adr_c));
    c ca ??

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jmjmjm
    Si j'ai compris tes conseil Emmanuel Delahaye je peux virer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Construit_Adresse(&adr_c);
    	bind(sock,(struct sockaddr *) &adr_c, sizeof(adr_c));
    c ca ??
    Je ne connais pas les fonctions par coeur, mais je t'ai passé un lien qui explique ce qu'il faut faire dans les 4 cas (client/serveur/UDP/TCP). Tu l'as lu ? Je n'en sais pas plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(sock,"Test de connexion",20);
    Déjà dit, mais c'est pas write() mais send()
    Pourquoi 20 ?

    Lire ceci d'urgence :

    http://www.developpez.net/forums/sho...23&postcount=2

    et corriger le code.

  9. #9
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    oui et d'apres ce que j'ai compris je peux enelever ca ! faut que je test ! mais la j'ai pas linux sous la main merci pour le liens il est plus complet que celui que j'avais et surtout que ce cours de m****

Discussions similaires

  1. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  2. [reseau] performances client/serveur
    Par orelero dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 10/05/2006, 16h36
  3. [Reseau] Dialogue client-serveur
    Par Nasky dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 08/08/2005, 15h07
  4. Crére un client/serveur sous linux en TCP
    Par Darknicosh dans le forum Développement
    Réponses: 11
    Dernier message: 20/06/2005, 10h19
  5. client/serveur tcp/ip en c sous unix
    Par oclone dans le forum Développement
    Réponses: 8
    Dernier message: 19/04/2005, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo