Aide sur l'api Winsock, sans le composant winsock de VB !!
kimmelf2
Messages postés267Date d'inscriptionlundi 22 septembre 2003StatutMembreDernière intervention27 novembre 2005
-
11 nov. 2003 à 02:50
kimmelf2
Messages postés267Date d'inscriptionlundi 22 septembre 2003StatutMembreDernière intervention27 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"
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202171 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...
kimmelf2
Messages postés267Date d'inscriptionlundi 22 septembre 2003StatutMembreDernière intervention27 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
kimmelf2
Messages postés267Date d'inscriptionlundi 22 septembre 2003StatutMembreDernière intervention27 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