Aide sur l'api Winsock, sans le composant winsock de VB !!

kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005 - 11 nov. 2003 à 02:50
kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005 - 14 nov. 2003 à 03:26
voila, je voudrais faire une appli serveur et une appli client utilisant les api de winsock.dll mais sans utiliser le composant winsock de VB.

j'aurais besoin d'un peu d'aide, de docs ou d'exemples...

j'ai deja bosse un peu dessus, mais la je bloque a cause d'une erreur :

le code pour le serveur :

Private Const SRV_PORT As Long = 11111

Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVR As Long, lpWSAD As WSA_DATA) As Long
Public Declare Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer
Public Declare Function connect Lib "wsock32.dll" (ByVal s As Long, addr As SOCK_ADDR, ByVal namelen As Long) As Long
Public Declare Function WSAGetLastError Lib "wsock32.dll" () As Integer
Public Declare Function bind Lib "wsock32.dll" (ByVal s As Long, addr As SOCK_ADDR, p As Integer) As Integer
Public Declare Function listen Lib "wsock32.dll" (ByVal s As Long, ByVal backlog As Long) As Long
Public Declare Function accept Lib "wsock32.dll" (ByVal s As Long, addr As SOCK_ADDR, namelen As Integer) As Long

Public Const INADDR_ANY  As Long = 0
Public Const AF_INET = 2
Public Const SOCK_STREAM = 1
Public Const IPPROTO_TCP = 6
Public Const WSADESCRIPTION_LEN = 256
Public Const WSASYS_STATUS_LEN = 128
Public Const INVALID_SOCKET = -1
Public Const SOCKET_ERROR = -1

Type SOCK_ADDR
    sin_family As Integer
    sin_port As Integer
    sin_addr As Long
    sin_zero(7) As Byte
End Type

Type WSA_DATA
    wVersion As Integer
    wHighVersion As Integer
    strDescription(WSADESCRIPTION_LEN + 1) As Byte
    strSystemStatus(WSASYS_STATUS_LEN + 1) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
End Type

Dim Sock As Long
Dim MsgSck As Long
Dim AP As SOCK_ADDR
Dim MyFrom As SOCK_ADDR
Dim wsadata As WSA_DATA

Private Sub Form_Load()
    Dim MyFromLen As Integer

    log.Text = Time & " : Démarrage du serveur sur le port " & SRV_PORT & vbCrLf
    
    If WSAStartup(&H101, wsadata) <> 0 Then
        MsgBox "Impossible d'initialiser Winsock : " & WSAGetLastError()
        WSACleanup
        Exit Sub
    End If
        
    AP.sin_family = AF_INET
    AP.sin_addr = INADDR_ANY
    AP.sin_port = htons(SRV_PORT)
    Sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
    If Sock = INVALID_SOCKET Then
        MsgBox "impossible de creer le socket : " & WSAGetLastError()
        WSACleanup
        Exit Sub
    End If
    
    If bind(Sock, AP, Len(AP)) = SOCKET_ERROR Then
        MsgBox "Erreur d'alloc d'adresse : " & WSAGetLastError()
        WSACleanup
        Exit Sub
    End If
        
    If listen(Sock, Len(Sock)) = SOCKET_ERROR Then
        MsgBox "Erreur lors de listen : " & WSAGetLastError()
        WSACleanup
    End If
    
    
    Do While True
        DoEvents
        
        MyFromLen = Len(MyFrom)
        MsgSck = accept(Sock, MyFrom, MyFromLen)
        If MsgSck = INVALID_SOCKET Then
            MsgBox "Erreur fonction accept : " & WSAGetLastError()
            WSACleanup
            Exit Do
        End If
        log.Text = log.Text & Time & " : Connection venant de " & inet_ntoa(MyFrom.sin_addr) & ":" & htons(MyFrom.sin_port) & " sur le socket " & MsgSck & vbCrLf
    Loop
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SocketClose (Sock)
End Sub



l'erreur : j'obteint toujours le popup "erreur fonction accept : 10014"

pouvez vous m'aider ????

merci d'avance

4 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 nov. 2003 à 10:25
J'ai teste, ca me fait pareil, mais je crois que c'est normal......
tu tentes d'accepter une connexion que personne ne tente d'ouvrir....

tu devrais essayer de mieux structurer ton code, avec des fonctions...

Listen
Connect...
Accept

parce que la, tu dois tout faire et c'est pas tres pratique...
en clair, tu devrais faire une app client avec winsock, le temps au moins de mettre au point ton serveur.
tu fais un boucle, et tant que accept renvoie -1, tu continues...

tu tente d'ouvrir un connexion sur ton serveur, et la, tu regardes ce que renvoie accept...

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005
13 nov. 2003 à 01:44
j'ai deja fais une appli serveur et une appli client avec winsock, evidemment ca marchais nickel, mais la je cherche a passer a jarter le composant winsock, histoire de ne pas etre limite a un type string pour les donnees, et aussi pour "tater le terrain" sur des protocoles autres que TCP et UDP.

pour le serveur avec API, j'ai essaye avec un client IE et mon client avec Winsock, ca bug pareil.

mais il me viens une idee. peut tu me dire avec quel client tu as essaye mon prog, et si c'est un client perso, si il envoie des donnees ??

car mon idee c'est que c'est peut etre pas l'acceptation de la connection qui genere l'erreur, c'est peut etre l'arrivee de donnees lors de l'iteration suivante de la boucle, voire l'iteration de la boucle elle meme : je "reaccept" une connection alors que (au choix) -1- le socket n'est pas remis en listen ET/OU -2- des donnees arrivent alors que je suis sur une fonction accepr et non recv.....

peut etre qu'en placant un recv dans la boucle ca marcherais mieux ???

je vais aller essayer ca illico presto tout de suite maintenant :-D

je reviendrais dire ce qu'il en est.

a+
0
kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005
13 nov. 2003 à 02:26
j'ai pas encore essaye, mais :

sans vouloir etre impoli, je dirais que je suis un abruti !!

j'ai oublie de dire que la ligne log.text = ... dans la boucle etait executee, j'ai bien l'affichage de l'acceptation de la connexion, hors ca ne peut pas etre affiche APRES le popup a cause du exit do.

ca signifie que la connection est acceptee avec succes, le texte ajoute dans le log.text, ensuite on remonte au debut de la boucle et c'est la que le popup d'erreur est affiche !

et c'est normal car on ne peut pas execute accept sur un socket qui n'est pas en listen !!!

l'erreur me parais evidente maintenant : je vais deja affiche l'entete de IE pour etre sur que la boucle se deroule correctement, et ensuite, je repasse mon socket en mode ecoute AVANT de fonor la boucle

maintenant le test de la verite ! ...

a+
0
kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005
14 nov. 2003 à 03:26
bon, pour l'instant j'ai vire la boucle, j'ai juste laisse un accept + un recv pour afficher la requete dans le textbox, et ca a l'air ok

juste ca, ca va. ensuite faudra que je boucle ...

si vous avez des infos, des conseils ....

n'hesitez pas
0
Rejoignez-nous