Introduction

Recherche

Exemple 1
Exemple 2
Ecrivez-moi

En partenariat avec amazon.fr

NETBIOS

Récupérer l'adresse MAC du poste distant

 

Pour utiliser l'exemple, il faut créer un nouveau projet sous VB et rajouter les fichiers suivants :

nbtstat.frm

netbios.bas

WinsockDefs.bas

 

Je précise qu'il s'agit juste d'un exemple pour comprendre le concept général.

Pour toutes questions : webmaster@vbenreseau.com

 

nbtstat.frm

Option Explicit

Dim sock As Long
Dim LocalServer As SOCK_ADDR
Dim rmtserver As SOCK_ADDR
Private Sub Command1_Click()

Dim CR As Long
Dim rqstPkt As NBPkt
Dim sDataToNet As String
Dim i As Integer

Text1.Text = ""
Debug.Print "heure = "; Time

sock = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
Debug.Print "sock = "; sock
If sock < 0 Then
MsgBox "Erreur sur la creation du socket = " & WSAGetLastError()
Exit Sub
End If

LocalServer.sin_family = AF_INET
LocalServer.sin_port = 0
LocalServer.sin_addr.S_addr = INADDR_ANY
Debug.Print "bind = "; CR
CR = bind(sock, LocalServer, Len(LocalServer))
Debug.Print "bind = "; CR
If CR < 0 Then
MsgBox "Erreur sur bind : " & WSAGetLastError()
FermerSocket sock
Exit Sub
End If


rmtserver.sin_family = AF_INET
rmtserver.sin_port = htons(137)
rmtserver.sin_addr.S_addr = inet_addr(Text3.Text)
rmtserver.sin_zero(0) = 0
CR = connect(sock, rmtserver, Len(rmtserver))
Debug.Print "Connect = "; CR
If CR < 0 Then
MsgBox "Erreur sur Connect : " & WSAGetLastError()
FermerSocket sock
Exit Sub
End If


rqstPkt.XactionID = htons(12345)
rqstPkt.Flags = htons(&H10)
rqstPkt.QCount = htons(1)
rqstPkt.ACount = 0
rqstPkt.NSCount = 0
rqstPkt.ARCount = 0

Dim tempString As String
tempString = Chr$(&H20) ' Netbios name, length must be 32 (decimal)

' The following is the Nibbled result of the string "* "
tempString = tempString + "CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

CopyMemory rqstPkt.QName(0), ByVal tempString, Len(tempString)

rqstPkt.QType = htons(&H21) ' NetBIOS NODE STATUS Resource Record
rqstPkt.QClass = htons(&H1) ' Internet class

' Convert the Data which is to be transmitted into a string
sDataToNet = ""
sDataToNet = String(Len(rqstPkt), 0)
CopyMemory ByVal sDataToNet, rqstPkt, Len(sDataToNet)
Debug.Print "szbuf = "; sDataToNet
Dim long1 As Long

long1 = Len(sDataToNet)
ReDim buff(long1 + 1) As Byte

For i = 1 To long1
buff(i - 1) = Asc(Mid(sDataToNet, i, 1))
Next
buff(long1) = 0

CR = send(sock, buff(0), long1, 0)
Debug.Print "send = "; CR
If CR < 0 Then
MsgBox "Erreur sur l'envoi du message = " & WSAGetLastError()
FermerSocket sock
Exit Sub
End If

Debug.Print "heure = "; Time

CR = WSAAsyncSelect(sock, Command2.hwnd, &H202, FD_READ)
Debug.Print "WSAAsyncSelect = "; CR
If CR < 0 Then
MsgBox "Erreur sur WSAAsyncSelect = " & WSAGetLastError()
FermerSocket sock
Exit Sub
End If

End Sub
Private Sub command2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Text1.Text = ProcessRcvdData(Recevoir(sock))

End Sub
Private Sub Form_Load()

Dim wsadata As WSA_DATA
Dim CR As Long

CR = WSAStartup(&H101, wsadata)
If CR <> 0 Then
MsgBox "Mauvaise version de Winsock.dll"
Exit Sub
End If

Text2.Text = NomMachine()
Text3.Text = IPMachine(NomMachine())

End Sub

Private Sub Form_Unload(Cancel As Integer)

FermerSocket sock

End Sub

 

netbios.bas

' This sampler was created by Jim Huff of Edinborg Productions
' on April 10, 1999. I created this sampler in order to demonstrate
' how to perform the equivalent of the NBTSTAT -A function which
' is available from a Command Prompt.

' Please feel free to use, or modify, this code in whatever method, or
' fashion, you choose. No warranties of any kind are implicity or
' explicitly implied by the author of this code.

' If you include portions of this code into your programs, please
' give some sort of credit referring to the author of this code.

' Author's EMail: JimHuff@JimHuff.User.ShenTel.Net
' JimHuff@ ShenTel.Net
Option Explicit

Type NBPkt
XactionID As Integer
Flags As Integer
QCount As Integer
ACount As Integer
NSCount As Integer
ARCount As Integer
QName(33) As Byte
QType As Integer
QClass As Integer
End Type

Type NodeName
bName(0 To 15) As Byte
RRFlag As Integer
End Type

Type Response
TTL As Long
RDLength As Integer
NUM_Names As Byte
End Type

Type RespPartII
NodeNameArray() As NodeName
End Type

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Dest As Any, Src As Any, ByVal cb&)

Function deNibble(sValue As String) As String

' This function performs the DeNibbling process of the
' names.

Dim sTemp As String

Dim Byte1 As Integer
Dim Byte2 As Integer

For i = 1 To Len(sValue) Step 2
Byte1 = Asc(Mid(sValue, i, 1)) - 65
Byte2 = (Asc(Mid(sValue, i + 1, 1)) - 65)
sTemp = sTemp + Chr$((Byte1 * 16) + Byte2)
Next i

deNibble = sTemp

End Function
Function NibbleIt(sValue As String) As String

' I don't feel like Nibbling It at this time.

End Function
Function HexConvert(bValue() As Byte) As String
Dim i As Integer

For i = 0 To UBound(bValue())
If bValue(i) < 15 Then
HexConvert = HexConvert + "0" & Hex(bValue(i))
If i < UBound(bValue) Then HexConvert = HexConvert + "-"
Else
HexConvert = HexConvert + Hex(bValue(i))
If i < UBound(bValue) Then HexConvert = HexConvert + "-"
End If
Next i

End Function
Function ProcessRcvdData(sDataFromNet As String) As String

' I am not going to bother explaining this mess. You can see
' what I did below and compare it to RFC-1001 and RFC-1002 to
' figure it out.

' Simply put, this function processes the received data and
' provides the calling subroutine with a text-based result.

Dim rcvdPkt As NBPkt
Dim rcvdResponse As Response
Dim rcvdRespPartII As RespPartII
Dim MACCode(5) As Byte
Dim Name_Flag As Integer
Dim udtData As String
Dim sTemp As String
Dim QName As String
Dim btemp(0) As Byte
Dim i As Integer
Dim j As Integer

udtData = Left(sDataFromNet, Len(rcvdPkt))

CopyMemory rcvdPkt.XactionID, ByVal udtData, Len(rcvdPkt)

sDataFromNet = Right(sDataFromNet, Len(sDataFromNet) - Len(udtData))

QName = String(32, 0)
CopyMemory ByVal QName, rcvdPkt.QName(1), 32

udtData = Left(sDataFromNet, 7)
sDataFromNet = Right(sDataFromNet, Len(sDataFromNet) - Len(udtData))

CopyMemory rcvdResponse.TTL, ByVal udtData, 8

ReDim rcvdRespPartII.NodeNameArray(rcvdResponse.NUM_Names)

ProcessRcvdData = " NetBIOS Machine Name Table" + vbCrLf + vbCrLf
ProcessRcvdData = ProcessRcvdData + " Name " + vbTab + _
"Type " + vbTab + "Status" + vbCrLf
ProcessRcvdData = ProcessRcvdData + "---------------------------------------------" _
+ vbCrLf

For i = 1 To rcvdResponse.NUM_Names

udtData = Left(sDataFromNet, Len(rcvdRespPartII.NodeNameArray(i)))
sDataFromNet = Right(sDataFromNet, Len(sDataFromNet) - Len(udtData)) + _
vbTab + vbTab

CopyMemory rcvdRespPartII.NodeNameArray(i), ByVal udtData, Len(udtData)

sTemp = String(15, 0)
CopyMemory ByVal sTemp, rcvdRespPartII.NodeNameArray(i).bName(0), Len(sTemp)

For j = 1 To Len(sTemp) ' Convert unprintable characters to a dot "."
DoEvents
If Asc(Mid(sTemp, j, 1)) < 32 Then Mid(sTemp, j, 1) = "."
Next j

ProcessRcvdData = ProcessRcvdData + sTemp + vbTab

btemp(0) = rcvdRespPartII.NodeNameArray(i).bName(15)

ProcessRcvdData = ProcessRcvdData + "<" & HexConvert(btemp) & "> " + vbTab

Name_Flag = htons(rcvdRespPartII.NodeNameArray(i).RRFlag)

If Int((Name_Flag / 256) And &H80) = &H80 Then
ProcessRcvdData = ProcessRcvdData + "GROUP "
Else
ProcessRcvdData = ProcessRcvdData + "UNIQUE "
End If
If Int((Name_Flag / 256) And &H10) = &H10 Then _
ProcessRcvdData = ProcessRcvdData + "DeRegistering"
If Int((Name_Flag / 256) And &H8) = &H8 Then _
ProcessRcvdData = ProcessRcvdData + "Name Conflict"
If Int((Name_Flag / 256) And &H4) = &H4 Then _
ProcessRcvdData = ProcessRcvdData + "Registered"
If Int((Name_Flag / 256) And &H2) = &H2 Then _
ProcessRcvdData = ProcessRcvdData + "Permanent Name"
ProcessRcvdData = ProcessRcvdData + vbCrLf
Next i
ProcessRcvdData = ProcessRcvdData + vbCrLf

udtData = Left(sDataFromNet, 6)
sDataFromNet = ""
CopyMemory MACCode(0), ByVal udtData, 6

ProcessRcvdData = ProcessRcvdData + "MAC Address = " & HexConvert(MACCode()) + _
vbCrLf + vbCrLf

End Function

 

WinsockDefs.bas

Option Explicit

Public Const WSANOERROR = 0

'Address families.

Public Const AF_UNSPEC = 0
Public Const AF_UNIX = 1
Public Const AF_INET = 2
Public Const AF_IMPLINK = 3
Public Const AF_PUP = 4
Public Const AF_CHAOS = 5
Public Const AF_IPX = 6
Public Const AF_NS = 6
Public Const AF_ISO = 7
Public Const AF_OSI = AF_ISO
Public Const AF_ECMA = 8
Public Const AF_DATAKIT = 9
Public Const AF_CCITT = 10
Public Const AF_SNA = 11
Public Const AF_DECnet = 12
Public Const AF_DLI = 13
Public Const AF_LAT = 14
Public Const AF_HYLINK = 15
Public Const AF_APPLETALK = 16
Public Const AF_NETBIOS = 17
Public Const AF_VOICEVIEW = 18
Public Const AF_FIREFOX = 19
Public Const AF_UNKNOWN1 = 20
Public Const AF_BAN = 21
Public Const AF_MAX = 22

Public Const PF_UNSPEC = AF_UNSPEC
Public Const PF_UNIX = AF_UNIX
Public Const PF_INET = AF_INET
Public Const PF_IMPLINK = AF_IMPLINK
Public Const PF_PUP = AF_PUP
Public Const PF_CHAOS = AF_CHAOS
Public Const PF_NS = AF_NS
Public Const PF_IPX = AF_IPX
Public Const PF_ISO = AF_ISO
Public Const PF_OSI = AF_OSI
Public Const PF_ECMA = AF_ECMA
Public Const PF_DATAKIT = AF_DATAKIT
Public Const PF_CCITT = AF_CCITT
Public Const PF_SNA = AF_SNA
Public Const PF_DECnet = AF_DECnet
Public Const PF_DLI = AF_DLI
Public Const PF_LAT = AF_LAT
Public Const PF_HYLINK = AF_HYLINK
Public Const PF_APPLETALK = AF_APPLETALK
Public Const PF_VOICEVIEW = AF_VOICEVIEW
Public Const PF_FIREFOX = AF_FIREFOX
Public Const PF_UNKNOWN1 = AF_UNKNOWN1
Public Const PF_BAN = AF_BAN
Public Const PF_MAX = AF_MAX


'Public Const AF_INET = 2
'Public Const PF_INET = AF_INET
Public Const IPPROTO_IP = 0
Public Const IPPROTO_ICMP = 1
Public Const IPPROTO_IGMP = 2
Public Const IPPROTO_GGP = 3
Public Const IPPROTO_TCP = 6
Public Const IPPROTO_PUP = 12
Public Const IPPROTO_UDP = 17
Public Const IPPROTO_IDP = 22
Public Const IPPROTO_ND = 77

'/*
' * bit values and indices for FD_XXX network events
' */
Public Const FD_READ = &H1
Public Const FD_WRITE = &H2
Public Const FD_OOB = &H4
Public Const FD_ACCEPT = &H8
Public Const FD_CONNECT = &H10
Public Const FD_CLOSE = &H20


'Define socket types
Public Const SOCK_STREAM = 1 'Stream socket
Public Const SOCK_DGRAM = 2 'Datagram socket
Public Const SOCK_RAW = 3 'Raw data socket
Public Const SOCK_RDM = 4 'Reliable Delivery socket
Public Const SOCK_SEQPACKET = 5 'Sequenced Packet socket

Public Const INADDR_ANY = &H0
Public Const INADDR_LOOPBACK = &H7F000001
Public Const INADDR_BROADCAST = &HFFFF
Public Const INADDR_NONE = &HFFFF


'Public Const SOCK_STREAM = 1&
Public Const WSADESCRIPTION_LEN = 256
Public Const WSASYS_STATUS_LEN = 128

Public Const INVALID_SOCKET = -1&
Public Const SOCKET_ERROR = -1&
'Public Const INADDR_NONE = &HFFFFFFFF

' All Windows Sockets error constants are biased by WSABASEERR from the "normal"

Public Const WSABASEERR = 10000

' Windows Sockets definitions of regular Microsoft C error constants

Public Const WSAEINTR = (WSABASEERR + 4)
Public Const WSAEBADF = (WSABASEERR + 9)
Public Const WSAEACCES = (WSABASEERR + 13)
Public Const WSAEFAULT = (WSABASEERR + 14)
Public Const WSAEINVAL = (WSABASEERR + 22)
Public Const WSAEMFILE = (WSABASEERR + 24)

' Windows Sockets definitions of regular Berkeley error constants

Public Const WSAEWOULDBLOCK = (WSABASEERR + 35)
Public Const WSAEINPROGRESS = (WSABASEERR + 36)
Public Const WSAEALREADY = (WSABASEERR + 37)
Public Const WSAENOTSOCK = (WSABASEERR + 38)
Public Const WSAEDESTADDRREQ = (WSABASEERR + 39)
Public Const WSAEMSGSIZE = (WSABASEERR + 40)
Public Const WSAEPROTOTYPE = (WSABASEERR + 41)
Public Const WSAENOPROTOOPT = (WSABASEERR + 42)
Public Const WSAEPROTONOSUPPORT = (WSABASEERR + 43)
Public Const WSAESOCKTNOSUPPORT = (WSABASEERR + 44)
Public Const WSAEOPNOTSUPP = (WSABASEERR + 45)
Public Const WSAEPFNOSUPPORT = (WSABASEERR + 46)
Public Const WSAEAFNOSUPPORT = (WSABASEERR + 47)
Public Const WSAEADDRINUSE = (WSABASEERR + 48)
Public Const WSAEADDRNOTAVAIL = (WSABASEERR + 49)
Public Const WSAENETDOWN = (WSABASEERR + 50)
Public Const WSAENETUNREACH = (WSABASEERR + 51)
Public Const WSAENETRESET = (WSABASEERR + 52)
Public Const WSAECONNABORTED = (WSABASEERR + 53)
Public Const WSAECONNRESET = (WSABASEERR + 54)
Public Const WSAENOBUFS = (WSABASEERR + 55)
Public Const WSAEISCONN = (WSABASEERR + 56)
Public Const WSAENOTCONN = (WSABASEERR + 57)
Public Const WSAESHUTDOWN = (WSABASEERR + 58)
Public Const WSAETOOMANYREFS = (WSABASEERR + 59)
Public Const WSAETIMEDOUT = (WSABASEERR + 60)
Public Const WSAECONNREFUSED = (WSABASEERR + 61)
Public Const WSAELOOP = (WSABASEERR + 62)
Public Const WSAENAMETOOLONG = (WSABASEERR + 63)
Public Const WSAEHOSTDOWN = (WSABASEERR + 64)
Public Const WSAEHOSTUNREACH = (WSABASEERR + 65)
Public Const WSAENOTEMPTY = (WSABASEERR + 66)
Public Const WSAEPROCLIM = (WSABASEERR + 67)
Public Const WSAEUSERS = (WSABASEERR + 68)
Public Const WSAEDQUOT = (WSABASEERR + 69)
Public Const WSAESTALE = (WSABASEERR + 70)
Public Const WSAEREMOTE = (WSABASEERR + 71)

Public Const WSAEDISCON = (WSABASEERR + 101)

' Extended Windows Sockets error constant definitions

Public Const WSASYSNOTREADY = (WSABASEERR + 91)
Public Const WSAVERNOTSUPPORTED = (WSABASEERR + 92)
Public Const WSANOTINITIALISED = (WSABASEERR + 93)

' Error return codes from gethostbyname() and gethostbyaddr()
' (when using the resolver). Note that these errors are
' retrieved via WSAGetLastError() and must therefore follow
' the rules for avoiding clashes with error numbers from
' specific implementations or language run-time systems.
' For this reason the codes are based at WSABASEERR+1001.
' Note also that [WSA]NO_ADDRESS is defined only for
' compatibility purposes.

' Authoritative Answer: Host not found

Public Const WSAHOST_NOT_FOUND = (WSABASEERR + 1001)
Public Const HOST_NOT_FOUND = WSAHOST_NOT_FOUND

' Non-Authoritative: Host not found, or SERVERFAIL

Public Const WSATRY_AGAIN = (WSABASEERR + 1002)
Public Const TRY_AGAIN = WSATRY_AGAIN

' Non recoverable errors, FORMERR, REFUSED, NOTIMP

Public Const WSANO_RECOVERY = (WSABASEERR + 1003)
Public Const NO_RECOVERY = WSANO_RECOVERY

' Valid name, no data record of requested type

Public Const WSANO_DATA = (WSABASEERR + 1004)
Public Const NO_DATA = WSANO_DATA

' no address, look for MX record

Public Const WSANO_ADDRESS = WSANO_DATA
Public Const NO_ADDRESS = WSANO_ADDRESS

' Windows Sockets errors redefined as regular Berkeley error constants.
' These are commented out in Windows NT to avoid conflicts with errno.h.
' Use the WSA constants instead.

Public Const EWOULDBLOCK = WSAEWOULDBLOCK
Public Const EINPROGRESS = WSAEINPROGRESS
Public Const EALREADY = WSAEALREADY
Public Const ENOTSOCK = WSAENOTSOCK
Public Const EDESTADDRREQ = WSAEDESTADDRREQ
Public Const EMSGSIZE = WSAEMSGSIZE
Public Const EPROTOTYPE = WSAEPROTOTYPE
Public Const ENOPROTOOPT = WSAENOPROTOOPT
Public Const EPROTONOSUPPORT = WSAEPROTONOSUPPORT
Public Const ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT
Public Const EOPNOTSUPP = WSAEOPNOTSUPP
Public Const EPFNOSUPPORT = WSAEPFNOSUPPORT
Public Const EAFNOSUPPORT = WSAEAFNOSUPPORT
Public Const EADDRINUSE = WSAEADDRINUSE
Public Const EADDRNOTAVAIL = WSAEADDRNOTAVAIL
Public Const ENETDOWN = WSAENETDOWN
Public Const ENETUNREACH = WSAENETUNREACH
Public Const ENETRESET = WSAENETRESET
Public Const ECONNABORTED = WSAECONNABORTED
Public Const ECONNRESET = WSAECONNRESET
Public Const ENOBUFS = WSAENOBUFS
Public Const EISCONN = WSAEISCONN
Public Const ENOTCONN = WSAENOTCONN
Public Const ESHUTDOWN = WSAESHUTDOWN
Public Const ETOOMANYREFS = WSAETOOMANYREFS
Public Const ETIMEDOUT = WSAETIMEDOUT
Public Const ECONNREFUSED = WSAECONNREFUSED
Public Const ELOOP = WSAELOOP
Public Const ENAMETOOLONG = WSAENAMETOOLONG
Public Const EHOSTDOWN = WSAEHOSTDOWN
Public Const EHOSTUNREACH = WSAEHOSTUNREACH
Public Const ENOTEMPTY = WSAENOTEMPTY
Public Const EPROCLIM = WSAEPROCLIM
Public Const EUSERS = WSAEUSERS
Public Const EDQUOT = WSAEDQUOT
Public Const ESTALE = WSAESTALE
Public Const EREMOTE = WSAEREMOTE

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

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

Type Inet_Adress
Byte4 As String * 1
Byte3 As String * 1
Byte2 As String * 1
Byte1 As String * 1
End Type

Public Const FD_SETSIZE = 64
Type FD_SET
fd_count As Long
fd_array(0 To FD_SETSIZE - 1) As Long
End Type

Type TIME_VAL
tv_sec As Long
tv_usec As Long
End Type

Declare Function bind Lib "wsock32" _
(ByVal s As Long, Addr As SOCK_ADDR, ByVal namelen As Long) As Long
Declare Function closesocket Lib "wsock32" _
(ByVal s As Long) As Long
Declare Function connect Lib "wsock32" _
(ByVal s As Long, name As SOCK_ADDR, ByVal namelen As Integer) As Long
Declare Function inet_addr Lib "wsock32" _
(ByVal cp As String) As Long
Declare Function htons Lib "wsock32" _
(ByVal hostshort As Integer) As Integer
Declare Function recv Lib "wsock32" _
(ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
Declare Function send Lib "wsock32" _
(ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
Declare Function shutdown Lib "wsock32" (ByVal s As Long, ByVal how As Long) As Long
Declare Function sselect Lib "wsock32" Alias "select" _
(ByVal nfds As Long, readfds As FD_SET, writefds As FD_SET,_
exceptfds As FD_SET, timeout As TIME_VAL) As Long
Declare Function Socket Lib "wsock32" Alias "socket" _
(ByVal af As Long, ByVal type_specification As Long, ByVal protocol As Long) As Long
Declare Function WSACancelBlockingCall Lib "wsock32" () As Long
Declare Function WSACleanUp Lib "wsock32" Alias "WSACleanup" () As Long
Declare Function WSAGetLastError Lib "wsock32" () As Long
Declare Function WSAStartup Lib "wsock32" _
(ByVal wVersionRequired As Integer, wsData As WSA_DATA) As Long

Declare Function WSAAsyncSelect Lib "wsock32.dll" _
(ByVal s As Long, ByVal hwnd As Long, _
ByVal
wMsg As Integer, ByVal lEvent As Long) As Integer

Declare Function listen Lib "wsock32.dll" _
(ByVal s As Long, ByVal backlog As Integer) As Integer

Declare Function accept Lib "wsock32.dll" _
(ByVal sock As Long, ByRef Addr As SOCK_ADDR, ByRef namelen As Integer) As Long
Declare Function inet_ntoa Lib "wsock32.dll" (ByVal inet As Long) As Long

Public
Sub FermerSocket(sock As Long)

Dim lngResult As Long

If sock <> 0 Then
lngResult = shutdown(sock, 2)
lngResult = closesocket(sock)
End If
lngResult = WSACancelBlockingCall
lngResult = WSACleanUp
sock = 0

End Sub
Public Function Accepter(sock As Long, rmtserver As SOCK_ADDR, AdrIP As String) As Long

Dim IPStruct As Inet_Adress

Accepter = accept(sock, rmtserver, Len(rmtserver))

CopyMemory IPStruct, rmtserver.sin_addr.S_addr, 4
AdrIP = CStr(Asc(IPStruct.Byte4)) & "." & _
CStr
(Asc(IPStruct.Byte3)) & "." & _
CStr
(Asc(IPStruct.Byte2)) & "." & _
CStr
(Asc(IPStruct.Byte1))

End Function
Public Function Recevoir(sock As Long) As String

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

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

If CR < 0 Then
MsgBox "Erreur sur recv = " & WSAGetLastError()
FermerSocket sock
Exit Function
End If
buff(CR) = 0

Recevoir = Left(StrConv(buff(), vbUnicode), CR)

End Function
Public Sub Envoyer(sock As Long, message As String)

Dim CR As Long

CR = send(sock, ByVal message, Len(message), 0)
If CR < 0 Then
MsgBox "Erreur sur l'envoi du message = " & WSAGetLastError()
FermerSocket sock
Exit Sub
End If

End Sub