Files
elwig-misc/wgmaster/vba/MTcpSocket.bas
2022-11-14 23:29:49 +01:00

216 lines
5.3 KiB
QBasic

Option Compare Database
' Fügen sie diesen Code in ein öffentliches Modul ein
Private Declare Function gethostbyname Lib "wsock32.dll" ( _
ByVal Name As String) As Long
Private Declare Function socket Lib "wsock32.dll" ( _
ByVal af As Long, _
ByVal prototype As Long, _
ByVal protocol As Long) As Long
Private Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long
Private Declare Function connect Lib "wsock32.dll" ( _
ByVal s As Long, _
Name As SOCKADDR, _
ByVal namelen As Long) As Long
Private Declare Function send Lib "wsock32.dll" ( _
ByVal s As Long, _
buf As Any, _
ByVal length As Long, _
ByVal flags As Long) As Long
Private Declare Function recv Lib "wsock32.dll" ( _
ByVal s As Long, _
buf As Any, _
ByVal length As Long, _
ByVal flags As Long) As Long
Private Declare Function ioctlsocket Lib "wsock32.dll" ( _
ByVal s As Long, _
ByVal cmd As Long, _
argp As Long) As Long
Private Declare Function inet_addr Lib "wsock32.dll" ( _
ByVal cp As String) As Long
Private Declare Function htons Lib "wsock32.dll" ( _
ByVal hostshort As Integer) As Integer
Private Declare Function WSAGetLastError Lib "wsock32.dll" () As Long
Private Declare Sub MoveMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal length As Long)
Private Declare Function WSAStartup Lib "wsock32.dll" ( _
ByVal wVersionRequested As Integer, _
lpWSAData As WSAData) As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
Private Type HOSTENT
hname As Long
haliases As Long
haddrtype As Integer
hlength As Integer
haddrlist As Long
End Type
Private Type SOCKADDR
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Type
Private Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * 257
szSystemStatus As String * 129
iMaxSockets As Long
iMaxUdpDg As Long
lpVendorInfo As Long
End Type
' eine der HOSTENT-haddrtype-Konstanten
Private Const AF_INET = 2 ' Internet Protokoll (UDP/IP oder TCP/IP).
' socket prototype-Konstanten
Private Const SOCK_STREAM = 1 ' 2-wege Stream. Bei AF_INET ist es das
' TCP/IP Protokoll
Private Const SOCK_DGRAM = 2 ' Datagramm Basierende verbindung. Bei AF_INET
' ist es das UDP Protokoll
' recv flags-Konstanten
Private Const MSG_PEEK = &H2 ' Daten aus dem Puffer lesen, aber nicht aus
' dem Puffer entfernen
' ioctlsocket cmd-Konstanten
Private Const FIONBIO = &H8004667E ' Setzen ob die Funktion bei der nächsten
' Datenanfrage zurückkehren soll
Dim hSock As Long
' IP-Adresse einer Internetadresse ermitteln
Public Function GetIP(ByVal HostName As String) As String
Dim pHost As Long, HostInfo As HOSTENT
Dim pIP As Long, IPArray(3) As Byte
' Informationen des Host ermitteln
pHost = gethostbyname(HostName)
If pHost = 0 Then Exit Function
' HOSTENT-Struktur kopieren
MoveMemory HostInfo, ByVal pHost, Len(HostInfo)
' Pointer der 1ten Ip-Adresse ermitteln
ReDim IpAddress(HostInfo.hlength - 1)
MoveMemory pIP, ByVal HostInfo.haddrlist, 4
MoveMemory IPArray(0), ByVal pIP, 4
GetIP = IPArray(0) & "." & IPArray(1) & "." & IPArray(2) & "." & IPArray(3)
End Function
' Mit einem Server verbinden
Public Function ConnectToServer(ByVal ServerIP As String, ByVal ServerPort _
As Long) As Long
Dim Retval As Long, ServerAddr As SOCKADDR
' Socket erstellen
hSock = socket(AF_INET, SOCK_STREAM, 0&)
If hSock = -1 Then
ConnectToServer = -1
Exit Function
End If
' mit dem Server verbinden
With ServerAddr
.sin_addr = inet_addr(ServerIP)
.sin_port = htons(ServerPort)
.sin_family = AF_INET
End With
Retval = connect(hSock, ServerAddr, Len(ServerAddr))
If Retval < 0 Then
MsgBox ("Connection Error:" + Retval)
Call closesocket(hSock)
ConnectToServer = -1
Exit Function
End If
' Rückkehren der Funktion nach dem Abfragen von ankommenden Daten erzwingen
Retval = ioctlsocket(hSock, FIONBIO, 1&)
' Socket-ID zurückgeben
ConnectToServer = hSock
End Function
' Sock/Verbindung schließen
Public Function Disconnect(ByRef Sock As Long)
Call closesocket(hSock)
Sock = 0
End Function
' Daten senden
Public Function SendData(ByVal Data As String) As Long
SendData = send(hSock, ByVal Data, Len(Data), 0&)
End Function
' Sind Daten angekommen ?
Public Function DataComeIn() As Long
Dim Tmpstr As String * 1
DataComeIn = recv(hSock, ByVal Tmpstr, Len(Tmpstr), MSG_PEEK)
If DataComeIn = -1 Then
DataComeIn = WSAGetLastError()
End If
End Function
' Daten ermitteln
Public Function GetData() As String
Dim Tmpstr As String * 4096, Retval As Long
Retval = recv(hSock, ByVal Tmpstr, Len(Tmpstr), 0&)
GetData = Left$(Tmpstr, Retval)
End Function
' Fügen Sie diesen Code in eine Form mit einem Command-Button und einem
' Textfeld ein
Public Function StartWinSocket() As Long
Dim Retval As Long, WSD As WSAData
Retval = WSAStartup(&H202, WSD)
If Retval < 0 Then
StartWinSocket = -1
End If
StartWinSocket = 0
End Function
Public Sub EndWinSocket()
Call Disconnect(hSock)
Call WSACleanup
End Sub
Public Function ReceiveString(length) As String
Dim resultString As String
While Len(resultString) < length
While DataComeIn() = 0
DoEvents
Wend
resultString = resultString + GetData()
Wend
ReceiveString = resultString
End Function