[C et Win]infinite link et sockets

infinite link et sockets [C et Win] - C++ - Programmation

Marsh Posté le 08-04-2003 à 19:33:10    

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
Reply

Marsh Posté le 08-04-2003 à 19:33:10   

Reply

Marsh Posté le 09-04-2003 à 12:04:04    

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


---------------
last.fm
Reply

Marsh Posté le 14-04-2003 à 18:14:24    

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: ...

Reply

Marsh Posté le 14-04-2003 à 18:56:51    

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
Reply

Marsh Posté le 14-04-2003 à 22:39:45    

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
Reply

Marsh Posté le 14-04-2003 à 23:16:22    

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) ?

Reply

Marsh Posté le 15-04-2003 à 00:04:55    

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
Reply

Marsh Posté le 15-04-2003 à 02:58:56    

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 ?
 

Reply

Marsh Posté le 15-04-2003 à 11:43:28    

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 ...)

Reply

Marsh Posté le 15-04-2003 à 15:46:51    

... 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  :(

Reply

Marsh Posté le 15-04-2003 à 15:46:51   

Reply

Marsh Posté le 15-04-2003 à 15:47:09    

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...

Reply

Marsh Posté le 15-04-2003 à 15:53:10    

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
Reply

Marsh Posté le 15-04-2003 à 16:01:10    

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
Reply

Marsh Posté le 15-04-2003 à 16:03:25    

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

Reply

Marsh Posté le 15-04-2003 à 16:08:03    

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
Reply

Marsh Posté le 15-04-2003 à 16:12:48    

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
Reply

Marsh Posté le 15-04-2003 à 16:27:36    

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

Reply

Marsh Posté le 15-04-2003 à 16:33:54    

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.

Reply

Marsh Posté le 15-04-2003 à 16:36:20    

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
Reply

Marsh Posté le 15-04-2003 à 17:05:53    

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
Reply

Marsh Posté le 15-04-2003 à 18:05:52    

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
Reply

Marsh Posté le 15-04-2003 à 18:11:16    

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.

Reply

Marsh Posté le 15-04-2003 à 18:15:40    

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));
 }
 
}

Reply

Marsh Posté le 15-04-2003 à 18:18:54    

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
Reply

Marsh Posté le 15-04-2003 à 18:23:40    

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

Reply

Marsh Posté le 15-04-2003 à 18:43:09    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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