salut
y a les socket en vba? il faut faire quoi pour en créé un? j'ai rien trouvé à ce propos sur le forum access...
merci
salut
y a les socket en vba? il faut faire quoi pour en créé un? j'ai rien trouvé à ce propos sur le forum access...
merci
Tu peux utiliser l'api Windows winsock pour initaliser des sockets. Exemple pour un ping :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301 Option Compare Database Option Explicit 'definition des constantes Private Const IP_STATUS_BASE As Long = 11000 Private Const IP_SUCCESS As Long = 0 Private Const IP_BUF_TOO_SMALL As Long = (11000 + 1) Private Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2) Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3) Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4) Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5) Private Const IP_NO_RESOURCES As Long = (11000 + 6) Private Const IP_BAD_OPTION As Long = (11000 + 7) Private Const IP_HW_ERROR As Long = (11000 + 8) Private Const IP_PACKET_TOO_BIG As Long = (11000 + 9) Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10) Private Const IP_BAD_REQ As Long = (11000 + 11) Private Const IP_BAD_ROUTE As Long = (11000 + 12) Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13) Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14) Private Const IP_PARAM_PROBLEM As Long = (11000 + 15) Private Const IP_SOURCE_QUENCH As Long = (11000 + 16) Private Const IP_OPTION_TOO_BIG As Long = (11000 + 17) Private Const IP_BAD_DESTINATION As Long = (11000 + 18) Private Const IP_ADDR_DELETED As Long = (11000 + 19) Private Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20) Private Const IP_MTU_CHANGE As Long = (11000 + 21) Private Const IP_UNLOAD As Long = (11000 + 22) Private Const IP_ADDR_ADDED As Long = (11000 + 23) Private Const IP_GENERAL_FAILURE As Long = (11000 + 50) Private Const MAX_IP_STATUS As Long = (11000 + 50) Private Const IP_PENDING As Long = (11000 + 255) Private Const PING_TIMEOUT As Long = 500 Private Const WS_VERSION_REQD As Long = &H101 Private Const MIN_SOCKETS_REQD As Long = 1 Private Const SOCKET_ERROR As Long = -1 Private Const INADDR_NONE As Long = &HFFFFFFFF Private Const MAX_WSADescription As Long = 256 Private Const MAX_WSASYSStatus As Long = 128 'Type de données Winsock Private Type WSADATA wVersion As Integer wHighVersion As Integer szDescription(0 To MAX_WSADescription) As Byte szSystemStatus(0 To MAX_WSASYSStatus) As Byte wMaxSockets As Long wMaxUDPDG As Long dwVendorInfo As Long End Type 'type d'options ICMP Private Type ICMP_OPTIONS Ttl As Byte 'Time to live Tos As Byte Flags As Byte 'options OptionsSize As Byte OptionsData As Long End Type 'Packet de reponse ICMP Public Type ICMP_ECHO_REPLY Address As Long status As Long RoundTripTime As Long DataSize As Long 'Reserved As Integer --> prévu mais pas encore implementé??? DataPointer As Long Options As ICMP_OPTIONS Data As String * 250 End Type 'Type adresse Private Type HOSTENT hName As Long 'nom hAliases As Long 'alias hAddrType As Integer 'type adresse hLen As Integer 'longueur --> IP6 supporté??? hAddrList As Long End Type 'GetHostByName --> cette fonction va nous permettre de 'résoudre le nom d'hote en adresse IP Private Declare Function gethostbyname Lib "wsock32" _ (ByVal hostname As String) As Long 'Fonction de copie memoire de la librairie Kernel Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (xDest As Any, _ xSource As Any, _ ByVal nbytes As Long) 'fonction longueur String du Kernel Private Declare Function lstrlenA Lib "kernel32" _ (lpString As Any) As Long 'demarrage du Winsock Private Declare Function WSAStartup Lib "wsock32" _ (ByVal wVersionRequired As Long, _ lpWSADATA As WSADATA) As Long 'fonction de nettoyage du protocole Winsock pour eviter les conflits possibles Private Declare Function WSACleanup Lib "wsock32" () As Long Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long 'fermeture du handle ICMP Private Declare Function IcmpCloseHandle Lib "icmp.dll" _ (ByVal IcmpHandle As Long) As Long 'envoi du packet echo Private Declare Function IcmpSendEcho Lib "icmp.dll" _ (ByVal IcmpHandle As Long, _ ByVal DestinationAddress As Long, _ ByVal RequestData As String, _ ByVal RequestSize As Long, _ ByVal RequestOptions As Long, _ ReplyBuffer As ICMP_ECHO_REPLY, _ ByVal ReplySize As Long, _ ByVal Timeout As Long) As Long 'Fonction permettant la conversion en representation longue de l'Adresse IP Private Declare Function inet_addr Lib "wsock32" _ (ByVal s As String) As Long 'Fonction de Ping Public Function Ping(sAddress As String, _ sDataToSend As String, _ ECHO As ICMP_ECHO_REPLY) As Long 'Si le ping réussit, le resultat va contenir les données suivantes: '.RoundTripTime = temps d'aller-retour en millisecondes '.Data = données retournées '(les memes qu'on a envoyé en principe) terminé par Null '.Address = adresse IP qui a veritablement repondu (alias possibles) '.DataSize = sizeOf(.data) '.Status = 0 si le ping a réussi 'Si le ping echoue le .ping contiendra le code d'erreur Dim hPort As Long Dim dwAddress As Long 'conversion de l'adresse au format quad long dwAddress = inet_addr(sAddress) 'si dwAdresse est invalide, la constante INADDR_NONE est retournée If dwAddress <> INADDR_NONE Then 'ouverture d'un port ICMP hPort = IcmpCreateFile() 'et si ca marche, on lance l'echo. If hPort Then Call IcmpSendEcho(hPort, _ dwAddress, _ sDataToSend, _ Len(sDataToSend), _ 0, _ ECHO, _ Len(ECHO), _ PING_TIMEOUT) 'on recupere le statut pour voir si on a réussi Ping = ECHO.status 'close the port handle Call IcmpCloseHandle(hPort) End If 'se rapportant au "If hPort" Else: 'l'adresse a été mal specifiée Ping = INADDR_NONE End If 'se rapportant au If dwAddress <> INADDR_NONE End Function 'cette fonction va nous permettre de determiner la réussite ou non du ping, 'et le cas écheant de trouver l'erreur... Public Function GetStatusCode(status As Long) As String Dim msg As String Select Case status Case IP_SUCCESS: msg = "ip success" Case INADDR_NONE: msg = "inet_addr: bad IP format" Case IP_BUF_TOO_SMALL: msg = "ip buf too_small" Case IP_DEST_NET_UNREACHABLE: msg = "ip dest net unreachable" Case IP_DEST_HOST_UNREACHABLE: msg = "ip dest host unreachable" Case IP_DEST_PROT_UNREACHABLE: msg = "ip dest prot unreachable" Case IP_DEST_PORT_UNREACHABLE: msg = "ip dest port unreachable" Case IP_NO_RESOURCES: msg = "ip no resources" Case IP_BAD_OPTION: msg = "ip bad option" Case IP_HW_ERROR: msg = "ip hw_error" Case IP_PACKET_TOO_BIG: msg = "ip packet too_big" Case IP_REQ_TIMED_OUT: msg = "ip req timed out" Case IP_BAD_REQ: msg = "ip bad req" Case IP_BAD_ROUTE: msg = "ip bad route" Case IP_TTL_EXPIRED_TRANSIT: msg = "ip ttl expired transit" Case IP_TTL_EXPIRED_REASSEM: msg = "ip ttl expired reassem" Case IP_PARAM_PROBLEM: msg = "ip param_problem" Case IP_SOURCE_QUENCH: msg = "ip source quench" Case IP_OPTION_TOO_BIG: msg = "ip option too_big" Case IP_BAD_DESTINATION: msg = "ip bad destination" Case IP_ADDR_DELETED: msg = "ip addr deleted" Case IP_SPEC_MTU_CHANGE: msg = "ip spec mtu change" Case IP_MTU_CHANGE: msg = "ip mtu_change" Case IP_UNLOAD: msg = "ip unload" Case IP_ADDR_ADDED: msg = "ip addr added" Case IP_GENERAL_FAILURE: msg = "ip general failure" Case IP_PENDING: msg = "ip pending" Case PING_TIMEOUT: msg = "ping timeout" Case Else: msg = "unknown msg returned" End Select GetStatusCode = CStr(status) & " [ " & msg & " ]" End Function 'conversion nom d'hote --> adresse IP Public Function GetIPFromHostName(ByVal sHostName As String) As String Dim nbytes As Long Dim ptrHosent As Long 'pointeur vers la structure "adresse hote" Dim ptrName As Long 'pointeur vers le Nom d'hote Dim ptrAddress As Long 'adresse du pointeur Dim ptrIPAddress As Long 'pointeur vers l'adresse IP Dim sAddress As String sAddress = Space$(4) ptrHosent = gethostbyname(sHostName & vbNullChar) If ptrHosent <> 0 Then 'on assigne l'adresse et l'offset du pointeur 'ptrName est le nom officiel de l'hote ptrName = ptrHosent 'liste des adresses de l'hote terminée par un Null 'l'adresse est à 12 octets du demarrage... ptrAddress = ptrHosent + 12 'on recupere l'adresse IP CopyMemory ptrName, ByVal ptrName, 4 CopyMemory ptrAddress, ByVal ptrAddress, 4 CopyMemory ptrIPAddress, ByVal ptrAddress, 4 CopyMemory ByVal sAddress, ByVal ptrIPAddress, 4 GetIPFromHostName = IPToText(sAddress) End If End Function 'fonction permettant de convertir une IP en txt Public Function IPToText(ByVal IPAddress As String) As String IPToText = CStr(Asc(IPAddress)) & "." & _ CStr(Asc(Mid$(IPAddress, 2, 1))) & "." & _ CStr(Asc(Mid$(IPAddress, 3, 1))) & "." & _ CStr(Asc(Mid$(IPAddress, 4, 1))) End Function 'Convertit une IP binaire en texte Public Function ConvertIp(Ip As Long) Dim i As Integer Dim strTemp As String strTemp = Format(Hex(Ip), "00000000") For i = 7 To 1 Step -2 ConvertIp = ConvertIp & ConvertHexToDec(Mid(strTemp, i, 2)) & "." Next i ConvertIp = Left(ConvertIp, Len(ConvertIp) - 1) End Function Private Function ConvertHexToDec(N As String) As String ConvertHexToDec = Format(CLng("&H" & N), "000") End Function 'routine de nettoyage du socket Public Sub SocketsCleanup() If WSACleanup() <> 0 Then MsgBox "Erreur lors du nettoyage du socket.", vbCritical End If End Sub 'Procedure d'initialisation du socket Public Function SocketsInitialize() As Boolean Dim WSAD As WSADATA SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS End Function
Quel est ton but ?[/quote]
Merci beaucoup Tofalu pour ce code,
par contre peux tu stp me donner un exemple avec la fonction "Ping" car je n'arrive pas à la mettre en oeuvre.
Merci d'avance.
http://grafikm.developpez.com/vbreseau/Lecon3/
C'est du VB, mais je pense que tu comprendras le principe. VBA et VB étant trés proches
mon but est de faire communiquer 2 applications access par message.
j'aimerais aussi pouvoir me connecter à un site et l'utiliser sans avoir à employer un browser
Dans ce cas, consultes les liens donnés plus haut
vi merci à toi et sorry pour le delai
merci encore
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager