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

VB 6 et antérieur Discussion :

Utilisation (avancée ?) de la dll WS2_32.dll


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut Utilisation (avancée ?) de la dll WS2_32.dll
    Pour établir une communication entre un poste Linux (une carte Raspberry) et mon PC, j'ai utilisé des sockets avec les fonctions de cette dll. J'ai une première version qui marche, et je voudrais l'améliorer, en particulier en ne bloquant pas le PC pendant plusieurs dizaines de secondes si le poste Linux n'est pas démarré.

    Pour cela, je rends ma socket "non bloquante" avant d'appeler la fonction "connect", puis je teste l'état de cette socket avec la fonction "select".

    Malheureusement, je n'ai pas pu trouver d'exemples de sources VB6 poussant jusque là l'utilisation des fonctions de l'API, et il me semble que le fichiers de déclarations que j'ai trouvé est incomplet et/ou contient des erreurs.

    Je m'adresse donc à ce forum dans l'espoir que quelqu'un pourra m'indiquer où trouver un fichier ".bas" contenant la traduction pour VB6 du "winsock.h" des développeurs C/C++

    Vous me direz que je n'ai qu'à la faire moi-même, cette traduction ! J'ai essayé, mais je ne connais pas assez bien le C, j'ai dû me planter quelque part, car j'ai reçu une réponse "Paramètre invalide" comme résultat de mes efforts.

    Pour montrer ma bonne volonté, je dirai également que j'ai parcouru les six derniers mois de ce forum, mais je n'ai rien trouvé.

    Alors, merci d'avance.

    AMIcalement.

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118

  3. #3
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut
    Eh bien oui, c'est exactement ce genre de chose que je cherche, sauf que celle-là ne répond pas à mon besoin, car elle ne couvre qu'une partie du champ de ws2_32.dll. La différence vient-elle de mon "avancée ?", je ne sais pas...

    J'utilise la fonction "select" (qui n'est pas dans ce fichier ".bas"), et une autre fonction que l'on doit appeler quand "select" a dit qu'il y avait une erreur : dans ce cas, ce n'est pas WSAGetLastError, mais "getsockopt(lsock, SOL_SOCKET, SO_ERROR, i(0), 8)". Or, dans mon fichier (comme dans le tien), il n'y a pas le prototype de "getsockopt". Pas très grave : d'après la doc MSDN, ce n'est pas difficile à reconstituer. Mais je n'ai trouvé nulle par les valeurs des constantes SOL_SOCKET et SO_ERROR.

    J'ai survolé rapidement les répertoires du serveur FTP que tu m'indiques : je n'ai rien trouvé qui réponde à ma recherche. Mais si tu en as d'autres dans ta manche, je me ferai un plaisir...

    Quoi qu'il en soit, merci d'avoir répondu : je me sens moins seul.

    AMIcalement.

  4. #4
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut
    Pour aller encore un peu plus loin, j'ai vu une première erreur : ce que l'on appelle "int" en C, doit être traduit en "long" en VB6.

    Ensuite, j'ai trouvé des "winsock2.h" sur Google. Et j'y ai trouvé "SOL_SOCKET = xffff;". Je l'avais d'abord traduit en "Public Const SOL_SOCKET as Long = &hFFFF", puis j'ai tenté "&h0000FFFF", mais ça ne changeait rien, puis finalement en "65535".

    J'y ai également trouvé "SO_ERROR = x1007;". Mais j'ai rencontré aussi au cours de mes balades un "SO_ERROR = 7;". J'ai essayé de combiner tout ça, mais j'ai toujours une erreur WSAEINVAL en retour de getsockopt.

    Pour poursuivre encore la description de mon problème, j'exécute les "select" dans la routine TIMER1_TIMER d'une Form où il y a un contrôle timer, avec un intervalle de 1 seconde. Pendant une quinzaine de secondes, tout semble se dérouler normalement. Puis, au bout de entre disons 15 et 25 secondes, le "select" indique qu'il y a une erreur sur "une des" (c'est à dire "la", puisqu'il n'y en a qu'une) sockets surveillées pour des erreurs. Et c'est pour voir quelle est cette erreur que j'appelle "getsockopt", sans réussir à le faire marcher.

    Pourquoi est-ce que c'est une telle galère de faire du développement avec les produits Microsoft ???!!!!!! Dans ma jeunesse, j'ai fait ce genre de boulot dans le monde IBM : il fallait naviguer longtemps dans la doc, mais quand tu trouvais, et quand tu faaisais ce qui était dit, ça marchait comme c'était dit ! Ah ! le bon vieux temps...

    Merci à ceux qui ont bien voulu lire jusqu'ici, et qui pourront peut-être éclairer ma lanterne.

    AMIcalement.

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Eh bien oui, c'est exactement ce genre de chose que je cherche, sauf que celle-là ne répond pas à mon besoin, car elle ne couvre qu'une partie du champ de ws2_32.dll. La différence vient-elle de mon "avancée ?", je ne sais pas...

    J'utilise la fonction "select" (qui n'est pas dans ce fichier ".bas"), et une autre fonction que l'on doit appeler quand "select" a dit qu'il y avait une erreur : dans ce cas, ce n'est pas WSAGetLastError, mais "getsockopt(lsock, SOL_SOCKET, SO_ERROR, i(0), 8)". Or, dans mon fichier (comme dans le tien), il n'y a pas le prototype de "getsockopt". Pas très grave : d'après la doc MSDN, ce n'est pas difficile à reconstituer. Mais je n'ai trouvé nulle par les valeurs des constantes SOL_SOCKET et SO_ERROR.

    J'ai survolé rapidement les répertoires du serveur FTP que tu m'indiques : je n'ai rien trouvé qui réponde à ma recherche. Mais si tu en as d'autres dans ta manche, je me ferai un plaisir...

    Quoi qu'il en soit, merci d'avoir répondu : je me sens moins seul.

    AMIcalement.
    Google est ton ami - encore faut-il savoir s'en servir
    => avec l'expression 'Declare Function Select Lib "ws2_32.dll" '
    tu devrais trouver tout les codes que tu recherches, style
    http://www.vbforums.com/showthread.php?683740-How

    Citation Envoyé par L'AMI Yves Voir le message
    Pour aller encore un peu plus loin, j'ai vu une première erreur : ce que l'on appelle "int" en C, doit être traduit en "long" en VB6.

    Ensuite, j'ai trouvé des "winsock2.h" sur Google. Et j'y ai trouvé "SOL_SOCKET = xffff;". Je l'avais d'abord traduit en "Public Const SOL_SOCKET as Long = &hFFFF", puis j'ai tenté "&h0000FFFF", mais ça ne changeait rien, puis finalement en "65535".

    J'y ai également trouvé "SO_ERROR = x1007;". Mais j'ai rencontré aussi au cours de mes balades un "SO_ERROR = 7;". J'ai essayé de combiner tout ça, mais j'ai toujours une erreur WSAEINVAL en retour de getsockopt.
    La syntaxe des valeurs hexadécimales :
    &h.... : valeur signée ex &hffff= -1
    &h....& : valeur non signée ex &hffff&=65535

    Citation Envoyé par L'AMI Yves Voir le message
    Pour poursuivre encore la description de mon problème, j'exécute les "select" dans la routine TIMER1_TIMER d'une Form où il y a un contrôle timer, avec un intervalle de 1 seconde. Pendant une quinzaine de secondes, tout semble se dérouler normalement. Puis, au bout de entre disons 15 et 25 secondes, le "select" indique qu'il y a une erreur sur "une des" (c'est à dire "la", puisqu'il n'y en a qu'une) sockets surveillées pour des erreurs. Et c'est pour voir quelle est cette erreur que j'appelle "getsockopt", sans réussir à le faire marcher.
    Outre le fait qu'on n'est pas devin tu devrais t'inspirer du tutoriel « Tutoriel sur le déboguage »

    Citation Envoyé par L'AMI Yves Voir le message
    Pourquoi est-ce que c'est une telle galère de faire du développement avec les produits Microsoft ???!!!!!! Dans ma jeunesse, j'ai fait ce genre de boulot dans le monde IBM : il fallait naviguer longtemps dans la doc, mais quand tu trouvais, et quand tu faaisais ce qui était dit, ça marchait comme c'était dit ! Ah ! le bon vieux temps...

    Merci à ceux qui ont bien voulu lire jusqu'ici, et qui pourront peut-être éclairer ma lanterne.

    AMIcalement.
    Installe la MSDN en téléchargement depuis la page Outils de ce site

  6. #6
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut
    Google est ton ami - encore faut-il savoir s'en servir
    => avec l'expression 'Declare Function Select Lib "ws2_32.dll" '
    tu devrais trouver tout les codes que tu recherches, style
    http://www.vbforums.com/showthread.php?683740-How
    C'est vrai que je n'ai pas l'habitude de taper de si longues phrases à mon ami. J'avais quand même trouvé cette URL au cours de mes recherches, mais elle ne contient pas les déclarations dont j'ai besoin.

    La syntaxe des valeurs hexadécimales :
    &h.... : valeur signée ex &hffff= -1
    &h....& : valeur non signée ex &hffff&=65535
    Je savais qu'il y avait une façon de noter les chaînes d'initialisation en précisant que c'était un "Long", mais je ne me souvenais plus quelle elle était, et je n'ai pas été capable de la retrouver dans le doc VB (tellement bien faite !). Mais déclarer "65535" donne exactement le même résultat, non ?

    Outre le fait qu'on n'est pas devin tu devrais t'inspirer du tutoriel « Tutoriel sur le déboguage »
    Oui, celui-là, je vais aller le regarder, car je n'ai pas l'habitude d'utiliser les espions et tout ça. Mais en l'occurrence, je doute que ça me fasse avancer beaucoup, puisque mon problème concerne des appels d'API. Je me demande d'ailleurs... Je modifie les options de la socquette pour pouvoir faire un "connect" non bloquant. Et en effet, je reprends la main tout de suite. Mais ça ne veut pas dire que j'ai annulé le time-out sur le connect. Donc l'erreur que me signale le "select", ça doit être le time-out du connect. Il faut que je creuse ça...

    Installe la MSDN en téléchargement depuis la page Outils de ce site
    msdnvb6fr a été téléchargé sur mon ordi le 7 décembre 2010. C'est de ça que je parle...

    Tu me fais un petit peu la leçon, et je le prends sans rancune, c'est à ça qu'on s'expose quand on vient présenter un problème sur un forum, mais il me semble quand même que je n'ai pas à rougir de ce que j'ai mis comme huile de coude dans cette affaire.

    Et encore merci de suivre ce fil. Je viendrai de toutes façon dire si j'ai trouvé une solution.

    AMIcalement.

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    .../...
    Tu me fais un petit peu la leçon, et je le prends sans rancune, c'est à ça qu'on s'expose quand on vient présenter un problème sur un forum, mais il me semble quand même que je n'ai pas à rougir de ce que j'ai mis comme huile de coude dans cette affaire.
    Du tout, mais, bien que j'ai tendance moi-même à pratiquer ainsi, ne pas poster de code expose à avoir fort peu de réponse
    d'où le on est pas devin.

  8. #8
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut
    Voici une remarque à laquelle je ne m'attendais pas : à part sur le "&Hffff&", que j'avais de toute façon contourné, mon problème n'est pas de codage, mais d'information sur les paramètres des appels aux API : je ne suis pas sûr que publier le code y aurait apporté grand chose : de toutes façons, il ne s'agit que d'appels/test du code retour/prise de décision. En fait, c'est ch... comme la mort ! C'est verbeux au possible, et il y a plusieurs pages de déclarations...

  9. #9
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    514
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 514
    Points : 131
    Points
    131
    Par défaut [Résolu, mais mal !] Utilisation (avancée ?) de WS2_32.dll
    Eh bien voilà : en fait, quand le "select" me dit qu'il y a une exception sur ma socquette, je ne cherche plus à savoir de quoi il s'agit, je fais l'hypothèse que c'est un time-out. Et ce qu'il faut faire dans ce cas, c'est relancer le "connect".

    C'est ce que j'ai fait.

    Et ça marche (jusqu'au jour où l'exception sera autre chose).

    Merci pour tout.

    AMIcalement.

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

Discussions similaires

  1. Utilisations croisés de références vers des dll
    Par Pilloutou dans le forum Framework .NET
    Réponses: 3
    Dernier message: 05/11/2006, 21h56
  2. une Dll peut elle utiliser les fonctions d'une autre dll?
    Par kantelise dans le forum Windows
    Réponses: 7
    Dernier message: 18/05/2006, 03h45
  3. Réponses: 6
    Dernier message: 07/04/2006, 01h10
  4. Réponses: 1
    Dernier message: 01/11/2005, 02h29
  5. Conventions à utiliser pour la création d'une DLL
    Par Writer dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2005, 09h24

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