Notes for Winsock Application Developers

WinGate 6.1

A l'attention des développeurs d'applications Winsock

Voici quelques conseils destinés aux développeurs d'applications Winsock 2, afin que les programmes créés soient compatibles avec le service WRP de WinGate (Winsock Redirection Protocol).

  1. Évitez d'appliquer des protocoles pour lesquels le client indique au serveur de façon explicite : son adresse IP, le port utilisé pour certaines connexions ou pour retourner des données au serveur. En effet :
    • Dans un système NAT, le client ne connaît probablement pas son IP réelle, et ne possède pas de dispositif permettant de la découvrir.
    • Le serveur peut identifier le client à l'aide de la fonction "getpeername". Il est donc inutile de transmettre ces informations s'il les possède déjà (de plus, cela risque de causer des erreurs).

  2. Évitez d'utiliser des numéros de ports fixes dans les applications clientes. Si le client doit accepter une connexion ou recevoir des données sur un port, le numéro doit être attribué par le système d'exploitation (en utilisant la fonction "bind()" avec un numéro de port égal à zéro). Veillez à utiliser cette méthode avec précaution car cela risque d'interférer avec certains systèmes NAT. La meilleure solution consiste à laisser le client demander les connexions nécessaires.
  3. N'oubliez pas qu'un ordinateur peut posséder plusieurs adresses IP. Ainsi, si vous appliquez "gethostbyname()" sur le résultat de "gethostname()" et utilisez la première adresse IP renvoyée, cela fait échouer de nombreuses applications. Si vous avez besoin de connaître votre adresse IP, veillez à l'obtenir en fonction de l'interface de l'ordinateur local qui communique avec l'autre hôte. Pour cela :
  • Si vous disposez d'une connexion ouverte à l'autre hôte, utilisez "getsockname()" sur ce socket afin d'obtenir votre adresse.
  • Si ne disposez pas d'une telle connexion, établissez une connexion "fictive" avec un service connu de l'autre hôte, et utilisez getsockname() sur le socket.
  • Si vous ne savez pas à quel service vous connecter, liez un socket "fictif" à chaque interface connue, et essayez de vous connecter à l'hôte sur un port au hasard. Si vous tentez de vous connecter sur une mauvaise interface, la tentative échoue rapidement et indique WSAENETUNREACHABLE. Si vous êtes sur la bonne interface, la connexion réussit ou bien elle est refusée.
  • Vous pouvez également utiliser le protocole SNMP afin d'obtenir la table de routage de votre ordinateur, et en déduire l'adresse IP.
  • Enfin, vous pouvez déterminer l'interface à l'aide des appels Winsock 2 .

 

Remarques :

  • Si vous utilisez le service WRP et WinGate Internet Client, ou un client et serveur socks, TOUS les postes clients possèdent plusieurs adresses IP. Le point numéro 3 (ci-dessus) est donc particulièrement important.
  • Certains proxies de niveau circuit ne peuvent pas utiliser getsockname() et getpeername(), et afficher l'interface sur le serveur. Toutefois, avec le WRP et WGIC cette opération est possible.

 

©2004 Qbik New Zealand Limited