Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1272 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C et Win]infinite link et sockets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C et Win]infinite link et sockets

n°356075
theshockwa​ve
I work at a firm named Koslow
Posté le 08-04-2003 à 19:33:10  profilanswer
 

J'ai posté ce message dans la section réseaux, mais n'ayant toujours pas de réponse, je me suis dit que j'avais peut-être plus de chances d'en trouver ici ...
 
 
Voilà la situation :
Je fais une appli assez simple : un client FTP. Jusque là, tout va bien.
Pour accéder à Internet depuis ma machine, je passe par un routeur qui fait aussi office de serveur FTP ... (c'est un vieux PC qui tourne sous Win95 il me semble) Le routage des paquets se fait via "infinite link" ("ilink" pour les intimes ;))
 
Je reviens à mon client FTP qui marche nikel en réseau local.
Cependant, dès qu'il s'agit de correspondre avec une autre machine sur le net, la fonction gethostbyname(char *) retourne une erreur. Je n'arrive pas trop à déterminer d'où vient le problème étant donné que le client FTP standard de Windows arrive à se connecter à l'hôte que j'ai choisi.:heink:
 
Pourquoi ? Ne passe-t-il pas lui aussi par un gethostbyname ? C'est une fonction du système, non ?


Message édité par theshockwave le 14-04-2003 à 18:22:14
mood
Publicité
Posté le 08-04-2003 à 19:33:10  profilanswer
 

n°356479
theshockwa​ve
I work at a firm named Koslow
Posté le 09-04-2003 à 12:04:04  profilanswer
 

Allez, une p'tite idée pour un programmeur qui mendie un coup de pouce ! ;)
 
 
 
:bounce:
UUUUUUUUPPPPPPPP !!!
:bounce:


---------------
last.fm
n°360753
theshockwa​ve
I work at a firm named Koslow
Posté le 14-04-2003 à 18:14:24  profilanswer
 

C'est pas que j'ai envie d'insister, mais là, je ne vois vraiment pas ...
 
 
Précisions sur le problème ... Je ne suis pas sur que ca puisse être appelé des précisions, mais bon ...
 
Si le gethostbyname foire et que j'essaye de me débrouiller avec des adresses IP, j'arrive à récupérer le hostent, mais par contre, je plante au connect avec une erreur qui n'est même pas donnée dans la doc ! :heink: ...

n°360783
Konar
Posté le 14-04-2003 à 18:56:51  profilanswer
 

plein de questions (mais pas de reponse a ton pb) :
 
t'as essayé ton prog dans un autre réseau local ? (en gros avec un autre routeur)
 
ton client ftp marche en local, mais est-ce qu'il marche sur une machine directement connecté au net (et avec des ftp du net) ? En gros est ce ke le gethostbyname() marche dans ce cas la ?
 
sinon ca fait koi qd tu désactives le serveur ftp du routeur ?
 
Edit : t'es sous windows nan ? si oui t'as essayé de faire vite fait un chtit prog ftp avec les fcts InternetConnect(), FtpSetCurrentDirectory(), FtpPutFile(), etc ? ca devrait te prendre 10 min, juste pour voir si ce cas marche


Message édité par Konar le 14-04-2003 à 19:02:24
n°360998
theshockwa​ve
I work at a firm named Koslow
Posté le 14-04-2003 à 22:39:45  profilanswer
 

Konar a écrit :

plein de questions (mais pas de reponse a ton pb) :
 
C'est mieux que rien ... Ca me fait même bien plaisir ... :D
 
t'as essayé ton prog dans un autre réseau local ? (en gros avec un autre routeur)
 
malheureusement, je n'ai pas d'autre réseau sous la main, donc non, je n'ai pas pu tester dans d'autres conditions ...
 
 
ton client ftp marche en local, mais est-ce qu'il marche sur une machine directement connecté au net (et avec des ftp du net) ? En gros est ce ke le gethostbyname() marche dans ce cas la ?
 
aucun problème si je lance le soft depuis le PC qui sert de routeur ...
 
 
sinon ca fait koi qd tu désactives le serveur ftp du routeur ?
 
Bonne question ... J'essayerai demain (ben oui, je ne suis plus au boulot, là, quand même ! :D)
 
 
Edit : t'es sous windows nan ? si oui t'as essayé de faire vite fait un chtit prog ftp avec les fcts InternetConnect(), FtpSetCurrentDirectory(), FtpPutFile(), etc ? ca devrait te prendre 10 min, juste pour voir si ce cas marche
 
Beeeen .... En fait, si le gethostbyname foire, je ne vois pas comment je peux faire pour aller plus loin ... J'ai une fonction pour 'juste' faire la connec au serveur et j'ai le gethostbyname dès les premières lignes ...


 
:jap: Merci de ton intérêt pour mes questions ... :D (questions aussi barbantes pour vous que pour moi :()


---------------
last.fm
n°361041
Konar
Posté le 14-04-2003 à 23:16:22  profilanswer
 

Pour le dernier truc, le 'chtit prog ftp', justement, ca se fait sans les fonctions socks, mais avec juste des fct dédiées.
 
Par exemple le prog suivant (devrait) upload un fichier :

Code :
  1. HINTERNET hIOpen = InternetOpen(NET_AGENT, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  2. if (!hIOpen)
  3. return ; // Cannot initialize internet connection
  4. HINTERNET hIConnect = InternetConnect(hIOpen, "ftp.microsoft.com", 21, "User", "Pass", INTERNET_SERVICE_FTP, 0, NULL);
  5. if (!hIConnect)
  6. return ; // cannot log
  7. FtpPutFile(hIConnect, "c:\\truc.dat", "truc.dat", FTP_TRANSFER_TYPE_BINARY, NULL)


 
(manque ptet 2 ou 3 tests par ci par la, ainsi que les InternetCloseHandle(), mais le principe fonctionne nickel)
 
sinon pour ton pb j'aurais tendance a dire que c'est la faute au serveur ftp sur le routeur, mais si des clients ftp autres que le tien fonctionnent, alors non.
 
et ton prog il fonctionne comment si tu te connectes a un serveur ftp exterieur mais qui a une 'vraie' adresse ip (avec des chiffres koi) ?

n°361076
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 00:04:55  profilanswer
 

Konar a écrit :

Pour le dernier truc, le 'chtit prog ftp', justement, ca se fait sans les fonctions socks, mais avec juste des fct dédiées.
 
Par exemple le prog suivant (devrait) upload un fichier :

Code :
  1. HINTERNET hIOpen = InternetOpen(NET_AGENT, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  2. if (!hIOpen)
  3. return ; // Cannot initialize internet connection
  4. HINTERNET hIConnect = InternetConnect(hIOpen, "ftp.microsoft.com", 21, "User", "Pass", INTERNET_SERVICE_FTP, 0, NULL);
  5. if (!hIConnect)
  6. return ; // cannot log
  7. FtpPutFile(hIConnect, "c:\\truc.dat", "truc.dat", FTP_TRANSFER_TYPE_BINARY, NULL)


 
(manque ptet 2 ou 3 tests par ci par la, ainsi que les InternetCloseHandle(), mais le principe fonctionne nickel)
 
sinon pour ton pb j'aurais tendance a dire que c'est la faute au serveur ftp sur le routeur, mais si des clients ftp autres que le tien fonctionnent, alors non.
 
et ton prog il fonctionne comment si tu te connectes a un serveur ftp exterieur mais qui a une 'vraie' adresse ip (avec des chiffres koi) ?


 
 
Seul problème : j'ai trouvé une lib Ftp pour éviter d'avoir à réécrire toutes les fonctions relatives au protocole ... :(
 
De plus, il vaut mieux que j'évite les fonctions Windows vu que c'est un module pour un moteur multi plate-formes ... A moins que je sois sur de pouvoir avoir un comportement similaire sur les autre plates-formes ...
 
Si je file une adresse IP, comme je l'ai dit dans mon 3ème post, j'arrive à avoir un pointeur sur la structure hostent (ce qu'est censé faire gethostbyname) mais par contre, je plante admirablement au connect et le code d'erreur retourné n'est pas documenté ... :(


---------------
last.fm
n°361118
Deaddy
Posté le 15-04-2003 à 02:58:56  profilanswer
 

un ptit bout de code de ton init socket serait le bienvenu
 
en attendant, que fait le bout de code suivant:
 
char host[200];
struct hostent *iptemp;
 
  iptemp=gethostbyname(host);
  if (iptemp) printf("%s : %s\n",host,inet_ntoa(*(struct in_addr*)iptemp->h_addr));
 
iptemp==0 peut-etre ? si oui que vaut host exactement ?
est-ce que ca marche pour host="forum.hardware.fr" par exemple ?
 

n°361474
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 11:43:28  profilanswer
 

Ca me saoule ...
 
J'ai essayé les lignes que tu proposes et ca me fait toujours le même problème ...
 
le pointeur retourné est NULL => il ne trouve pas l'host. Pourtant, un simple ping fonctionne ... (et là, je suis sur la même machine sous IE et aucun pb ...)
 
Tu veux vraiment voir 'mon' initialisation de sockets ? (c'est une lib que j'ai reprise donc ce n'est pas vraiment la mienne, mais je n'ai pas cherché en détails ...)

n°362010
Deaddy
Posté le 15-04-2003 à 15:46:51  profilanswer
 

... et ca retourne nul aussi pour host="forum.hardware.fr" ??
 
si oui, (et si tu resoud bien les noms avec un ping), t'as plus qu'a réinstaller tes libs  :(

mood
Publicité
Posté le 15-04-2003 à 15:46:51  profilanswer
 

n°362011
Konar
Posté le 15-04-2003 à 15:47:09  profilanswer
 

theShOcKwAvE a écrit :

Ca me saoule ...
 
J'ai essayé les lignes que tu proposes et ca me fait toujours le même problème ...
 
le pointeur retourné est NULL => il ne trouve pas l'host.


 
WSAGetLastError() retourne quel code d'erreur ?
 
File toujours ton initialisation de sockets, on sait jms...

n°362021
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 15:53:10  profilanswer
 

Deaddy a écrit :

... et ca retourne nul aussi pour host="forum.hardware.fr" ??
 
si oui, (et si tu resoud bien les noms avec un ping), t'as plus qu'a réinstaller tes libs  :(  


 
ouais ... Pour forum.hardware.fr, ca fait pareil ... Mais ce qui me surprend le plus, c'est qu'en prenant mon exe, je me mets sur le routeur et ca passe ... :heink:
 
Je poste l'init des sockets dans un instant ...


---------------
last.fm
n°362037
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 16:01:10  profilanswer
 

Voilà le début de la fonction de connection de la lib que j'utilise ...
 

Code :
  1. GLOBALDEF int FtpConnect(const char *host, netbuf **nControl)
  2. {
  3.   int sControl;
  4.   struct sockaddr_in sin;
  5.   struct hostent *phe;
  6.   struct servent *pse;
  7.   int on=1;
  8.   netbuf *ctrl;
  9.   char *lhost;
  10.   char *pnum;
  11.   memset(&sin,0,sizeof(sin));
  12.   sin.sin_family = AF_INET;
  13.   lhost = strdup(host);
  14.   pnum = strchr(lhost,':');
  15.   if (pnum == NULL)
  16.   {
  17. #if defined(VMS)
  18.     sin.sin_port = htons(21);
  19. #else
  20.     if ((pse = getservbyname("ftp","tcp" )) == NULL)
  21.     {
  22.       perror("getservbyname" );
  23.       return 0;
  24.     }
  25.     sin.sin_port = pse->s_port;
  26. #endif
  27.   }
  28.   else
  29.   {
  30.     *pnum++ = '\0';
  31.     if (isdigit(*pnum))
  32.       sin.sin_port = htons((unsigned short)atoi(pnum));
  33.     else
  34.     {
  35.       pse = getservbyname(pnum,"tcp" );
  36.       sin.sin_port = pse->s_port;
  37.     }
  38.   }
  39.   if ((sin.sin_addr.s_addr = inet_addr(lhost)) == -1)
  40.   {
  41.     if((phe = gethostbyname(lhost)) == NULL)         // <--- ici !
  42.     {
  43.       if(lhost) free(lhost);
  44.       perror("gethostbyname" );
  45.       return 0;
  46.     }
  47.     memcpy((char *)&sin.sin_addr, phe->h_addr, phe->h_length);
  48.   }
  49.   free(lhost);
  50.   sControl = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  51.   if (sControl == -1)
  52.   {
  53.     perror("socket" );
  54.     return 0;
  55.   }
  56.   if (setsockopt(sControl,SOL_SOCKET,SO_REUSEADDR,
  57.   SETSOCKOPT_OPTVAL_TYPE &on, sizeof(on)) == -1)
  58.   {
  59.     perror("setsockopt" );
  60.     net_close(sControl);
  61.     return 0;
  62.   }
  63.   if (connect(sControl, (struct sockaddr *)&sin, sizeof(sin)) == -1)
  64.   {
  65. // .....


 
A noter donc que si je file une string contenant une adresse, je plante sur le connect ...


---------------
last.fm
n°362041
Deaddy
Posté le 15-04-2003 à 16:03:25  profilanswer
 

ptite question bete, au cas ou: si t sous windows, t'as pas oublie le  
WSAStartup(0x101,&wsadata);
avant le gethostbyname ?

n°362047
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 16:08:03  profilanswer
 

Konar a écrit :


 
WSAGetLastError() retourne quel code d'erreur ?
 
File toujours ton initialisation de sockets, on sait jms...


 
 
Héhéhé ... Boolay inside (je parle pour moi ... :D)
 
 
Je refais le test en initialisant la lib ... 2 minutes ! :lol:


---------------
last.fm
n°362056
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 16:12:48  profilanswer
 

Bon ... Maintenant, j'ai le WSA startup (je reprends l'exemple vite fait que tu m'avais proposé plus haut ... J'avais fait le WSA startup dans mon autre appli ... pas de pb de ce côté là ...)
 
Erreur retournée par le gethostbyname : WSAHOST_NOT_FOUND
 
visiblement ... il ne doit pas trouver l'hôte ! :D (je suis malin ... :D)


---------------
last.fm
n°362107
Deaddy
Posté le 15-04-2003 à 16:27:36  profilanswer
 

essai avec ce prog (en ligne de commande)
http://deaddy.no-ip.org/solve.exe
 
usage: solve <host>

n°362133
Konar
Posté le 15-04-2003 à 16:33:54  profilanswer
 

Deaddy a écrit :

essai avec ce prog (en ligne de commande)
http://deaddy.no-ip.org/solve.exe
 
usage: solve <host>
 


 
si ca rate (et a mon avis ca va rater paske ton code parait bon et marche directement connecté au net), bah y a plus ka regarder au niveau de la conf du routeur, et a tester ton prog sur un autre réseau.

n°362141
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 16:36:20  profilanswer
 

hum .... Je n'arrive pas à accéder à ton URL ... :(
 
si ton fichier n'est pas trop gros, tu peux me l'envoyer par mail ...
 
 
 
 
PS : je t'ai envoyé l'adresse en Private ...


Message édité par theshockwave le 15-04-2003 à 17:28:08

---------------
last.fm
n°362220
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 17:05:53  profilanswer
 

Konar a écrit :


 
si ca rate (et a mon avis ca va rater paske ton code parait bon et marche directement connecté au net), bah y a plus ka regarder au niveau de la conf du routeur, et a tester ton prog sur un autre réseau.


 
ce qui me chagrine, c'est que j'arrive à me connecter avec le client FTP sous DOS .... C'est ca qui me pousse à me dire que je dois faire une erreur ...


---------------
last.fm
n°362307
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 18:05:52  profilanswer
 

Deaddy a écrit :

essai avec ce prog (en ligne de commande)
http://deaddy.no-ip.org/solve.exe
 
usage: solve <host>
 


 
 
Euuuuuuuh .... Ca marche ... Comment ca se fait ? :D
 
Tu peux me filer le source ? Je dois bien avoir fait une connerie quelque part bordel ! :D


---------------
last.fm
n°362313
Konar
Posté le 15-04-2003 à 18:11:16  profilanswer
 

theShOcKwAvE a écrit :


 
 
Euuuuuuuh .... Ca marche ... Comment ca se fait ? :D
 
Tu peux me filer le source ? Je dois bien avoir fait une connerie quelque part bordel ! :D


 
tu peux deja essayer de virer tout ce qui est entre le " pnum = strchr(lhost,':';); " et le "if ((sin.sin_addr.s_addr..." juste pour faire le gethostbyname() dès le debut.

n°362321
Deaddy
Posté le 15-04-2003 à 18:15:40  profilanswer
 

donc le source, compilé sous Visual C++: (ya ptet des include en trop)
 
 
#include <stdio.h>
#include <windows.h>
#include <shellapi.h>
#include <winsock.h>
#include <io.h>
 
WSADATA wsadata;
void main(int argc,char* argv[])
{
struct hostent *iptemp;
 
 if (argc<2) {printf("USAGE: %s <host>\n",argv[0]);exit(-1);}
 WSAStartup(0x101,&wsadata);
 if (argc==2)
 {  
  iptemp=gethostbyname(argv[1]);
  if (iptemp) printf("%s : %s\n",argv[1],inet_ntoa(*(struct in_addr*)iptemp->h_addr));
 }
 
}

n°362323
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 18:18:54  profilanswer
 

Tu dois avoir raison : je compile ton code (qui n'était pas différent du mien dans sa substance) et effectivement ... Ca ne marche pas :sweat:
 
... Qu'est-ce que je dois réinstaller ?


---------------
last.fm
n°362333
Deaddy
Posté le 15-04-2003 à 18:23:40  profilanswer
 

bah je sais pas trop en fait; réinstaller tout VC++ c lourd
au link g ajouter wsock32.lib; je te l'ai envoyer par mail

n°362346
theshockwa​ve
I work at a firm named Koslow
Posté le 15-04-2003 à 18:43:09  profilanswer
 

Bieeeen vuuu ! :D
 
Trop fort ! Merci Deaddy ! :jap:
 
Je linkais avec ws2_32.lib ... Je remplace par le nom de la lib que tu m'as filé (qui est filée avec VC++ ...) et ca marche ...
 
Infiniment merci ! :D


---------------
last.fm
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C et Win]infinite link et sockets

 

Sujets relatifs
[C] Erreur Sockets sous Linux : Socket operation or non-socket[C++, Linux] Pb de link
Erreur de link[Borland]Sockets
[Borland C++ Builder 6] Déclarer BD Access, sans passer par l'ODBC Win[Win] Comment rafraichir la fenêtre?
Redirection sorties std vers socketsQuestion pratique avec les src, link, include etc...
[Help] Souci aux niveaux des sessions sous Win XP [presque Resolu] 
Plus de sujets relatifs à : [C et Win]infinite link et sockets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR