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 |
|