Soyez le premier à donner votre avis sur cette source.
Snippet vu 9 732 fois - Téléchargée 49 fois
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)
1 avril 2004 à 21:02
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 ;)
3 mars 2004 à 13:17
30 oct. 2003 à 10:09
voir : http://www.vbfrance.com/code.aspx?ID=8101
26 févr. 2003 à 18:38
Et puis est-ce que la dll est plus légère que l'ocx?
14 oct. 2002 à 20:33
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.