serveur et client réseau sur même machine

serveur et client réseau sur même machine - C - Programmation

Marsh Posté le 29-10-2013 à 15:00:27    

Bonjour,
 
Je rencontre un problème assez curieux. J'ai 2 applications qui tourne sur une même machine, l'une lancée en premier qui fait serveur , et la suivante qui doit se connecter sur cette première. Le problème est que ca ne fonctionne pas ( j'ai écrit le code de la version cliente, mais pas la serveur bien que j'ai le code source ).
 
En gros, mon application me dit connection refused.
 
Ma machine est en 172.17.253.0/16 , et j'écoute sur le port 7172. Lorsque je me connecte sur 172.17.253.0:7172 , j'ai le "connection refused".
 
Voici le résultat d'une commande netstat :
 

Code :
  1. tcp        0      0 *:sunrpc                *:*                     LISTEN
  2. tcp        0      0 *:webmin                *:*                     LISTEN
  3. tcp        0      0 *:epmd                  *:*                     LISTEN
  4. tcp        0      0 *:36116                 *:*                     LISTEN
  5. tcp        0      0 *:ssh                   *:*                     LISTEN
  6. tcp        0      0 localhost:postgresql    *:*                     LISTEN
  7. tcp        0      0 *:15672                 *:*                     LISTEN
  8. tcp        0      0 *:55672                 *:*                     LISTEN
  9. tcp        0      0 localhost:smtp          *:*                     LISTEN
  10. tcp        0      0 *:microsoft-ds          *:*                     LISTEN
  11. tcp        0      0 innovationserver1.:7172 *:*                     LISTEN
  12. tcp        0      0 *:swat                  *:*                     LISTEN
  13. tcp        0      0 *:59850                 *:*                     LISTEN
  14. tcp        0      0 *:netbios-ssn           *:*                     LISTEN


 
Et voici mes routes ( route -n ) j'ai rajouté à la main lo d'ailleurs.
 

Code :
  1. Table de routage IP du noyau
  2. Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
  3. 0.0.0.0         172.18.11.200   0.0.0.0         UG    0      0        0 eth0
  4. 127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
  5. 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth1
  6. 172.18.11.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0


 
On peut remarquer dans le netstat que mon application qui fait un listen est différencié de tous les autres services. En effet, la plupart sont en *:port, mais mon application a innovationserver1.:port
 
Pourquoi y a t il une différence entre * et innovationserver1.  ? je précise que innovationserver1 est le résultat que j'ai en tapant la commande hostname ( le . en plus je ne sais pas à quoi il correspond ).
 
Y a t il un probleme dans l'initialisation de la partie serveur qui fait que je n'écoute pas sur * ?
 
Dans ce cas, comment puis je y remédier ? En créant d'autres routes ? J'ai tenté de me connecter sur 127.0.0.1 plutot que 172.17.253.0 ( après avoir créé la route ) mais ca ne change rien.
 
Je pourrai poster du code si besoin, coté client et serveur, mais je ne peux pas dans l'immédiat.
 
Merci d'avance :)
 
PS : vaut mieux poster sur prog ou sur réseau pro ? ( ou encore os alternatif )

Reply

Marsh Posté le 29-10-2013 à 15:00:27   

Reply

Marsh Posté le 29-10-2013 à 15:42:48    


Normallement, lorsque tu passes la structure sockaddr_in a la fonction bind(), tu peux lui dire d'écouter sur toutes les interfaces réseaux (INADDR_ANY ou 0.0.0.0), où sur une adresse spécifique. Si tu utilises une adresse spécfique, il faudra impérativement utiliser la même pour se connecter.
 
La sortie de netstat semble indiquer que tu as utilisé une adresse IP spécifique. utilise l'option -n de netstat pour avoir la version numérique. Utilise ensuite ton client avec cette adresse.

Reply

Marsh Posté le 29-10-2013 à 15:50:18    

tpierron a écrit :


Normallement, lorsque tu passes la structure sockaddr_in a la fonction bind(), tu peux lui dire d'écouter sur toutes les interfaces réseaux (INADDR_ANY ou 0.0.0.0), où sur une adresse spécifique. Si tu utilises une adresse spécfique, il faudra impérativement utiliser la même pour se connecter.
 
La sortie de netstat semble indiquer que tu as utilisé une adresse IP spécifique. utilise l'option -n de netstat pour avoir la version numérique. Utilise ensuite ton client avec cette adresse.


 
 
Je te remercie. Le code du serveur est écrit avec boost ( donc du C++ désolé pour la catégorie C , je vais corriger ), je ne connais pas boost ( dans le sens, je ne l'ai jamais utilisé ), donc je peine un peu à lire le code rapidement.
 
De ce que j'ai vu dans le code, il n 'y a pas de open / bind / listen / accept , mais directement un acceptor avec des paramètres dans le constructeur, et uniquement des appels à async_accept. Du coup, le code est pas mal masqué, je ne vois pas trop ce que ca fait pour le moment.
 
 
Je vais tenter d'extraire un peu de code pour le poster ( je ne peux pas poster directement le code , ca ne serait pas compréhensible, il manque trop de choses ).

Reply

Marsh Posté le 29-10-2013 à 15:55:12    

ok super, grace au netstat -n , j'obtiens le résultat suivant :  
 
 
tcp        0      0 172.18.11.107:7172      0.0.0.0:*               LISTEN
 
 
Donc cela signifie que le serveur écoute sur la premiere carte réseau par défaut ( 172.17.253.0 n est pas eth0 mais eth1) , voila la source du probleme.
 
Je vais voir comment corriger le code pour que le serveur ecoute sur l'interface choisie.
 
Merci bien  :jap:


Message édité par xilebo le 29-10-2013 à 15:55:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed