Api winsock

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 732 fois - Téléchargée 49 fois

Contenu du snippet

Les APIs de Winsock
(ce serai plus simple avec l activeX).

Sorry ya pas de zip ...

Source / Exemple :


Declare Function Socket Lib "wsock32.dll" Alias "socket" (ByVal afinet As Integer, ByVal socktype As Integer)
Declare Function connect Lib "wsock32" (ByVal sock As Long, name As SOCK_ADDR, ByVal namelen As Integer) As Long
Declare Function bind Lib "wsock32" (ByVal sock As Long, addr As SOCK_ADDR, ByVal namelen As Long) As Long
Declare Function listen Lib "wsock32.dll" (ByVal sock As Long, ByVal backlog As Integer) As Integer
Declare Function send Lib "wsock32" (ByVal sock As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
Declare Function recv Lib "wsock32" (ByVal sock As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
    Type IN_ADDR
        S_addr As Long
    End Type
    Type SOCK_ADDR
        sin_family As Integer
        sin_port As Integer
        sin_addr As IN_ADDR
        sin_zero(0 To 7) As Byte
    End Type
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
'module
Public Const PF_INET = 2
Public Const SOCK_STREAM = 1
Public Const SOCK_DGRAM = 2
Public Const IPPROTO_IP = 0
Public Const IPPROTO_TCP = 6
Public Const IPPROTO_UDP = 17
Public Const INVALID_SOCKET = -1
Public Const SOCKET_ERROR = -1
Public Const INADDR_ANY = &H0
Public Const SOCKET_ERROR = -1
Public Const MSG_OOB = &H1
Public Const MSG_DONTROUTE = &H4
Public Const MSG_OOB = &H1
Public Const MSG_PEEK = &H2
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

'connecter

Dim CR As Long
Dim sock As Long
Dim RemoteServer As SOCK_ADDR

RemoteServer.sin_family = AF_INET
RemoteServer.sin_port = htons(2000)
RemoteServer.sin_addr.S_addr = inet_addr("XXX.XXX.XXX.XXX")
RemoteServer.sin_zero(0) = 0
CR = connect(sock, RemoteServer, Len(RemoteServer))

'Création d 'un socket

Dim sock As Long
 
sock = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

'Port

Dim CR As Long
Dim LocalServer As SOCK_ADDR

LocalServer.sin_family = AF_INET
LocalServer.sin_port = 0
LocalServer.sin_addr.S_addr = INADDR_ANY

CR = bind(sock, LocalServer, Len(LocalServer))

'listen

Dim CR As Long
Dim sock As Long

CR = listen(sock, 1)

'Envoyer
 
Dim CR As Long
Dim longSend As Long

longSend = Len(chaine)
ReDim buff(longSend + 1) As Byte

For i = 1 To longSend
    buff(i - 1) = Asc(Mid(chaine, i, 1))
Next
buff(longSend) = 0

CR = send(sock, buff(0), longSend, 0)

'recevoir

Const MAX_BUFF_SIZE = 10000
Dim buff(0 To MAX_BUFF_SIZE) As Byte
Dim sock As Long
Dim CR As Long

CR = recv(sock, buff(0), MAX_BUFF_SIZE, 0)

'Fermer un socket

Dim Result As Long
Dim sock As Long
     
Result = closesocket(sock)

A voir également

Ajouter un commentaire Commentaires
damienvi Messages postés 5 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 1 avril 2004
1 avril 2004 à 21:02
Bonjour,


Je pose le décor : je veux faire de la communication entre un PC et un automate sous une couche TCP IP.

Pour ce faire, j'utilise l'API de windows (wsock32.dll) car je ne veux pas utiliser le contrôle winsock OCX, j'ai bien compris qu'il fallait :

1) initialiser la dll avec
Declare Function WSAStartup Lib "wsock32" _
(ByVal wVersionRequired As Integer, _
wsData As WSA_DATA) As Long

2) créer le socket avec
Declare Function Socket Lib "wsock32.dll" Alias "socket" _
(ByVal afinet As Integer, _
ByVal socktype As Integer, _
ByVal protocol As Integer) As Long

3) connecter le socket avec
Declare Function connect Lib "wsock32" _
(ByVal sock As Long, _
name As SOCK_ADDR, _
ByVal namelen As Integer) As Long

4) Envoyer un message sur le pc distant avec
Declare Function send Lib "wsock32" _
(ByVal sock As Long, _
buffer As Any, _
ByVal length As Long, _
ByVal flags As Long) As Long


Mais c'est maintenant que ça se complique, car avec le "client" crée ci dessus, je voudrais créer un évènement lors d'une réception d'un message par le serveur sur lequel je suis connecté.
Je crois avoir compris (mais là, je suis moins sur) que :

1) on peut analyser les évènemtns qui affectent un socket avec :
Declare Function WSAAsyncSelect Lib "wsock32.dll" _
(ByVal sock As Long, _
ByVal hwnd As Long, _
ByVal wMsg As Integer, _
ByVal lEvent As Long) As Integer
mais je ne sais pas trop m'en servir, à cause de hwnd.

2) on lit le message du socket reçu avec :
Declare Function recv Lib "wsock32" _
(ByVal sock As Long, _
buffer As Any, _
ByVal length As Long, _
ByVal flags As Long) As Long


Mon problème est donc le suivant :
comment avoir un évènement (du type "Data_arrival" du contrôle winsock) qui me réveille afin que je puisse utiliser ma fonction recv pour lire dans mon socket.


Merci pour le Share ;)
Je suis automaticien et pas informaticien, soyez indulgent ;)
flagyg Messages postés 50 Date d'inscription samedi 1 septembre 2001 Statut Membre Dernière intervention 20 septembre 2006
3 mars 2004 à 13:17
c'est nul,il manque des APIs en plus,et tu aurais au moins pu mettre des fonctions plutôt que de simplement copier le code qui se trouve ici : http://vbasicsite.free.fr/ApiWinsock.htm
sydesys Messages postés 3 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 19 septembre 2003
30 oct. 2003 à 10:09
L'API devient importante quand par example on souhaite créer une DLL qui exploite WinSock. Si on utilise l'ocx winsock dans une dll. On obtient des problèmes lors de l'utilisation de cette dll dans plusieurs thread ! Problème de Pile.

voir : http://www.vbfrance.com/code.aspx?ID=8101
yoman64 Messages postés 962 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 2 août 2010 1
26 févr. 2003 à 18:38
Pi pour les trojan c'est parfais,mais est-ce que la dll winsock vient avec toute les version de windows?
Et puis est-ce que la dll est plus légère que l'ocx?
Gorgot Messages postés 95 Date d'inscription lundi 28 janvier 2002 Statut Membre Dernière intervention 21 février 2008
14 oct. 2002 à 20:33
on fait des économies d'espace car on a pas besoin de j'oindre l'ocx winsock avec nos projets...
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.