Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/04/2018, à 00:12

CodeRom

[Résolu] port random sur un server codé

Bonjour j'apprend actuelement  les socket en C , j'ai écris un client/server simple qui ne fait rien d'autre que de se connecter l'un à l'autre.Mon but étant de faire démarrer le server au boot de mon pc, ça j'y suis arrivé. Mais j'ai un problème, je ne peux me connecter a mon server car le port que j'ai écris dans le code ne correspond pas au port attribuer au server.
Concrétement j'ai codé de me connecter via le port 1234 et lorsque je boot et que j'execute la commande : sudo netstat -lp --inet, je vois le port (au hazard) 54382 associer a mon server.Et évidement le port change a chaque boot.

J'avais avant codé un client server qui s'echangeaient des fichiers texte, et je n'avais eu aucun problème avec le même système de boot du server au démarrage du pc.Là seul difference c'est que j'avais démonisé le server mais je doute que le problème vienne de là.

Donc ma question est : comment dois je faire pour que mon server est bien le port attribué dans mon code et pas un port random ?

Merci !

Dernière modification par CodeRom (Le 06/04/2018, à 13:27)

Hors ligne

#2 Le 04/04/2018, à 10:23

Bigcake

Re : [Résolu] port random sur un server codé

Bonjour,

Je n'ai jamais eu ce comportement en créant des serveurs, je pense que tu a un bug.
Tu peux peut-être vérifier le cycle de vie de ta(tes) variable(s) qui gère(nt) le n° de port jusqu'au bind()
Tu devrai montrer la partie de ton code où tu fait ton bind() si tu veux qu'on puisse t'aider.

Dernière modification par Bigcake (Le 04/04/2018, à 10:26)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#3 Le 04/04/2018, à 11:00

CodeRom

Re : [Résolu] port random sur un server codé

Voici la partie la plus pertinente du code du server. Avant c'est des déclarations de variables et voila.Perso je n'y vois rien d'anormal a ce code ou alors je suis bigleu ce qui est possible smile

up_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sin.sin_addr.s_addr = inet_addr("192.168.1.13");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(55);
bzero(&(sin.sin_zero), 8);

setsockopt(up_sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, (char*)&option, sizeof(option));

    bind(up_sock, (SOCKADDR*)&sin, sizeof(sin));

    listen(up_sock, 5);

    up_csock = accept(up_sock, (SOCKADDR*)&csin, &crecsize);
app = fopen("log-manager","wb");

tailleBlockRecut = recv(up_csock, (char *)&bufferPoidFileExe, sizeof(poidExe), 0);
    do
    {
        tailleBlockRecut = recv(up_csock, bufferReceptionExe, *bufferPoidFileExe, 0);
      if(tailleBlockRecut < 0)
perror("recv taille block");

        totalRcv += tailleBlockRecut;

        if(totalRcv == poidExe)
            break;

        dataWrite = fwrite(&bufferReceptionExe, sizeof(char), *bufferPoidFileExe, app);

    }while(totalRcv < poidExe);

ret = system("chmod +x log-manager");

close(up_sock);
close(up_csock);
return EXIT_SUCCESS;

Hors ligne

#4 Le 04/04/2018, à 12:01

Bigcake

Re : [Résolu] port random sur un server codé

Je vois 2 problèmes dans ton code :
1) AUCUNE vérification de retour d'erreur des fonctions systèmes.
    entre socket(), bind(), setsockopt(), listen(), accept(), tu a au moins 50 cas d'erreurs système possible
    si socket() retourne une erreur, tout les appels systèmes suivants vont partir en erreur et tu n'en saura rien.

2) Ta structure sin doit être totalement mise à zéro avant de l'utiliser, ton comportement aléatoire viens surement de là :

memset( &sin, 0, sizeof(sin) );

bzero() est une fonction système dépréciée et ne devrai donc plus être utilisée (après, c'est toi qui voit... tant que c'est accessible....)

          4.3BSD.   This  function is deprecated (marked as LEGACY in POSIX.1-2001): use memset(3) in new programs.  POSIX.1-2008 removes the
       specification of bzero().

"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#5 Le 04/04/2018, à 15:51

CodeRom

Re : [Résolu] port random sur un server codé

Alors pour les retour d'erreur c'est "normal" qu'il n'y en ai aucun, je l'ai fait expret, en fait le server est génerer par le programme, donc le code du server est d'abord copier dans un fichier puis ce fichier est compiler via une command de compilation qui est gcc -o toto temp.c  toto etant un exemple et temp.c le fichier ou s'écrit le code.J'avais supprimé tout les retour d'erreurs pour avoir moins de lignes a copier dans le fichier (oui je sais fegnéantise quand tu nous tiens).
J'ai changé bzero() par memset() mais le problème persiste.
En fait mon programme est une GUI d'autres programme que j'ai écrit, et il ya en tout 3 servers qui boot au lancement du pc les autres server fonctionnent normalement j''ai un problème qu'avec un server précis et je doute que le retour d'erreur y soit pour quelque chose, le memeset y'avait une chance mais ce n'est pas ça.Peut être la façon de compiler le dis server la command : gcc -o toto temp.c est peut être inadapté.
j'ai verifé les permissions du fichier binaire generer rien d'anormal de ce coté j'ai bien les droits de lecture/ecriture et execution sur le server.

Donc a part la command de compilation je n'ai toujours aucune idée d'où viens le problème.
Merci de ton aide au passage.

Dernière modification par CodeRom (Le 04/04/2018, à 15:53)

Hors ligne

#6 Le 04/04/2018, à 20:08

Bigcake

Re : [Résolu] port random sur un server codé

CodeRom a écrit :

J'avais supprimé tout les retour d'erreurs pour avoir moins de lignes a copier dans le fichier (oui je sais fegnéantise quand tu nous tiens).

Ce qu'il y a de bien avec la vérification du retour d'erreur c'est que quand ton programme ne fait pas ce que tu veux sur les appels système, tu voit tout de suite le problème.
Ne pas faire de vérification de retour d'erreurs, c'est perdre plus de temps et de sueur quand t'a un problème.
Perdre du temps a gérer le retour d'erreur, c'est perdre beaucoup moins de temps a débugger, et ça permet de faire du fallback ou de prévenir l'utilisateur = logiciels beaucoup plus stable et user-friendly.

CodeRom a écrit :

J'ai changé bzero() par memset() mais le problème persiste.

mmmm... je suis pas sur de comprendre... tu as juste remplacé (donc uniquement pour sin.sin_zero), ou tu l'a utilisé sur la totalité de ta structure sin ?


En y regardant de plus près, ton utilisation de setsockopt() est mauvaise
Les options à passer se font une à une, tu ne peux pas faire OPT1 | OPT2
sur mon système SO_REUSEADDR = 2, SO_REUSEPORT = 15, donc SO_REUSEADDR | SO_REUSEPORT = 15

Une chose est sûr.... le problème ne viens pas de gcc sur ce problème, surtout si tu ne mets aucune option optimisation, ou autre qui ne compile pas exactement ce que le code source fournit.

Dernière modification par Bigcake (Le 04/04/2018, à 20:11)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#7 Le 05/04/2018, à 01:14

CodeRom

Re : [Résolu] port random sur un server codé

Je suis d'accord pour la gestion d'erreurs je vais rajouter les lignes adéquates.
Pour memset je l'ai utilisé sur l'ensemble de la sructure pas uniquement pour sin.sin_zero

Je vais aussi corriger la fonctions setsockopt().
ça ne resoudra pas le problème qui reste pour moi une belle énigme mais en tout cas j'aurais un code plus propre.

Merci d'avoir pris le temps de répondre c'est sympa.

Dernière modification par CodeRom (Le 05/04/2018, à 01:15)

Hors ligne

#8 Le 05/04/2018, à 09:53

Bigcake

Re : [Résolu] port random sur un server codé

Si aucune fonction système ne te renvoi d'erreur, la prochaine étape serai d'utiliser valgrind avec ton programme et voir les éventuelles erreurs d'accès mémoire ou problèmes d'initialisations.

Sinon, y a un truc qui me trouble depuis le début dans ton post #1 tu parle du port 1234, mais dans ton code tu a mis en dur le port 55.
Par convention, les ports < 1024 sont réservés et ne devraient pas être utilisés dans tes programmes : https://fr.wikipedia.org/wiki/Liste_de_ports_logiciels

Dernière modification par Bigcake (Le 05/04/2018, à 09:56)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#9 Le 05/04/2018, à 12:54

CodeRom

Re : [Résolu] port random sur un server codé

Ah oui pour le port en fait j'ai un programme en interface graphique (GTK) ou je renseigne l'ip , le port et le nom du server, puis le code est copier dans un fichier puis compiler, j'en ai parler un peu plus haut.Lors de mon premier post je passais le port 1234 a mon server puis quand tu m'as demandé le code j'ai passé le port 55 voila pourquoi il apparait ds le copier coller.Je vais essayer de passé un port sup a 1024 , le solution est peu être là.

Quand a valgrind je ne conaissais pas je vais voir se que je peu faire avec, merci.

Hors ligne

#10 Le 06/04/2018, à 13:24

CodeRom

Re : [Résolu] port random sur un server codé

Bonjour, bon j'ai résolu le problème en mettant le code du server dans un projet et en le compilant a part, puis j'ai intégré le binaire a mon Interface grapĥique via le code principal.

Ce que je n'ai toujours pas compris c'est pourquoi le fait de générer le server (par le fait de copier le code dans un fichier puis de le compiler via un system(command); engendre un port aléatoire sur le server.C'est un comportement incompréhensible.

Mais bon sujet résolu donc, un grand merci a BigCake pour son aide, c'est sympa.

Dernière modification par CodeRom (Le 06/04/2018, à 13:25)

Hors ligne