216 lines
5.3 KiB
QBasic
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
|