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

 C Discussion :

Compilation/Execution programme serveur/client TCP


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut Compilation/Execution programme serveur/client TCP
    Bonjour a tous,

    Je suis en train d'essayer de faire fonctionner un serveur/client TCP en c.
    J'ai suivi le tuto disponible sur geeksforgeeks : https://www.geeksforgeeks.org/socket-programming-cc/ mais je rencontre un problème lors de l'exécution du programme.
    En effet, j'ai crée un projet et j'ai mis les deux fichiers sources du serveur et du client (voir code) mais lorsque j'exécute les deux fichier rien ne s'affiche sur le terminal, les programmes ne sont pas en attente et je ne comprend pas pourquoi. Je vous mets les deux codes sources ainsi que l'affichage du terminal. Merci d'avance pour vos réponses.


    SERVEUR :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #include <netinet/in.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #define PORT 8080
    int main(int argc, char const* argv[])
    {
    	int server_fd, new_socket, valread;
    	struct sockaddr_in address;
    	int opt = 1;
    	int addrlen = sizeof(address);
    	char buffer[1024] = { 0 };
    	char* hello = "Hello from server";
     
    	// Creating socket file descriptor
    	if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    		perror("socket failed");
    		exit(EXIT_FAILURE);
    	}
     
    	// Forcefully attaching socket to the port 8080
    	if (setsockopt(server_fd, SOL_SOCKET,
    				SO_REUSEADDR | SO_REUSEPORT, &opt,
    				sizeof(opt))) {
    		perror("setsockopt");
    		exit(EXIT_FAILURE);
    	}
    	address.sin_family = AF_INET;
    	address.sin_addr.s_addr = INADDR_ANY;
    	address.sin_port = htons(PORT);
     
    	// Forcefully attaching socket to the port 8080
    	if (bind(server_fd, (struct sockaddr*)&address,
    			sizeof(address))
    		< 0) {
    		perror("bind failed");
    		exit(EXIT_FAILURE);
    	}
    	if (listen(server_fd, 3) < 0) {
    		perror("listen");
    		exit(EXIT_FAILURE);
    	}
    	if ((new_socket
    		= accept(server_fd, (struct sockaddr*)&address,
    				(socklen_t*)&addrlen))
    		< 0) {
    		perror("accept");
    		exit(EXIT_FAILURE);
    	}
    	valread = read(new_socket, buffer, 1024);
    	printf("%s\n", buffer);
    	send(new_socket, hello, strlen(hello), 0);
    	printf("Hello message sent\n");
     
    	// closing the connected socket
    	close(new_socket);
    	// closing the listening socket
    	shutdown(server_fd, SHUT_RDWR);
    	return 0;
    }
    CLIENT :

    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
     
    // Client side C/C++ program to demonstrate Socket
    // programming
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #define PORT 8080
     
    int main(int argc, char const* argv[])
    {
    	int sock = 0, valread, client_fd;
    	struct sockaddr_in serv_addr;
    	char* hello = "Hello from client";
    	char buffer[1024] = { 0 };
    	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    		printf("\n Socket creation error \n");
    		return -1;
    	}
     
    	serv_addr.sin_family = AF_INET;
    	serv_addr.sin_port = htons(PORT);
     
    	// Convert IPv4 and IPv6 addresses from text to binary
    	// form
    	if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)
    		<= 0) {
    		printf(
    			"\nInvalid address/ Address not supported \n");
    		return -1;
    	}
     
    	if ((client_fd
    		= connect(sock, (struct sockaddr*)&serv_addr,
    				sizeof(serv_addr)))
    		< 0) {
    		printf("\nConnection Failed \n");
    		return -1;
    	}
    	send(sock, hello, strlen(hello), 0);
    	printf("Hello message sent\n");
    	valread = read(sock, buffer, 1024);
    	printf("%s\n", buffer);
     
    	// closing the connected socket
    	close(client_fd);
    	return 0;
    }

    CAPTURE ECRAN DU TERMINAL :
    Nom : Capture-terminal-server_c.PNG
Affichages : 499
Taille : 18,9 Ko
    Nom : Capture-terminal-client_c.PNG
Affichages : 460
Taille : 22,9 Ko

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par mrpilon Voir le message
    mais lorsque j'exécute les deux fichier rien ne s'affiche sur le terminal, les programmes ne sont pas en attente et je ne comprend pas pourquoi. Je vous mets les deux codes sources ainsi que l'affichage du terminal.
    Tu es sûr d'avoir exécuté tes programmes??? Parce que tout ce que tu nous montres dans ton terminal, c'est la compilation de tes codes.

    De mon côté, quand je les exécute, exécute réellement sur mon ordi et non pas dans mon esprit, ben ça fonctionne
    Nom : VirtualBox_Xubuntu64_17_11_2022_11_48_27.jpg
Affichages : 458
Taille : 63,7 Ko

    Sinon concernant tes messages, tu oublies le '\0'. En effet, tu envoies send(sock, hello, strlen(hello), 0) donc si "hello" contient "coucou" (ou plus exactement 'c', 'o', 'u', 'c', 'o', 'u', '\0'), tu n'envoies que 6 caractères donc 'c', 'o', 'u', 'c', 'o', 'u'. Et le '\0' tu ne l'envoies pas.

    Du côté du serveur, tu lis le contenu du socket donc tu lis 'c', 'o', 'u', 'c', 'o', 'u' mais tu l'affiches via "%s" !!! Comment tu sais que la chaine reçue aura bien un '\0' puisque nulle part tu ne le garantis???
    Donc soit tu envoies send(sock, hello, strlen(hello) + 1, 0), soit à la réception tu rajoutes buffer[val_read]='\0'.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    Je ne sais pas quoi te répondre

    1) Es-tu au courant que gcc est 1 compilateur/ éditeur de liens ? et donc tu compiles, tu n'exécutes pas.
    Justement tu dis à gcc de créer 2 exécutables client et server (et au passage sans l'option -Wall ce n'est pas terrible. Mais comme tu ne sembles pas maîtriser la bascule -o c'est compliqué )
    Sous Linux pour exécuter 1 programme c'est ./client et ./server (Mais comme tu ne sembles pas maîtriser Linux c'est compliqué )

    2) Ou alors tu exécutes mais tes perror ne redirigent pas vers la sortie standard.
    Comme je n'ai jamais fait l'effort de savoir comment faire , remplace tous tes perror par des printf classiques

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Merci pour vos réponses. Je suis débutant en c et je n'avais pas bien compris comment fonctionne la compilation et l'execution d'un programme en c...
    C'est bien plus clair maintenant et effectivement ça fonctionne mieux quand on exécute le programme haha...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mrpilon Voir le message
    Je suis débutant en c et je n'avais pas bien compris comment fonctionne la compilation et l'execution d'un programme en c...
    Dans ce cas là, on ne s'attaque pas aux clients/serveurs et aux sockets. On commence par afficher des étoiles en nombre croissant style "triangle", compter le nombre de caractères d'une chaine, inverser deux variables, inverser une chaine, bref on commence par apprendre le C !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    Sauf que j'en suis quand même un peu plus avancé et je suis déjà passé par tous ça.. juste je n'avais encore jamais setup un projet (J'utilisais une copie d'un projet qui avais un automake et qui me permettait de directement compilé et exécuté). Bref merci pour vos précisons, bonne continuation

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Pour le problème du \0 signalé par Sve@r qui n'est pas envoyé, j'avais écrit une fonction Strlenz

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    size_t Strlenz(char *str) {
        return(strlen(str)+1);
    }
    Ça m'a beaucoup simplifié la vie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Serveur/client TCP --> Vous en pensez quoi ?
    Par shepounet dans le forum Réseau
    Réponses: 1
    Dernier message: 15/12/2010, 18h36
  2. Serveur / client TCP
    Par shepounet dans le forum Réseau
    Réponses: 6
    Dernier message: 24/11/2010, 14h09
  3. Problème de programme serveur/client
    Par Khnade dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 07/08/2008, 21h22
  4. Serveur / client tcp
    Par margou dans le forum Débuter
    Réponses: 3
    Dernier message: 08/06/2008, 10h47
  5. [Réseau] Problème Serveur Client TCP linux embarqué
    Par FabienpERRIN dans le forum Réseau
    Réponses: 2
    Dernier message: 31/07/2007, 20h47

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