Filone
Erfahrenes Mitglied
Ich habe ein Socket erstellt und mittels WSAAsyncSelect die Events FD_ACCEPT, FD_CLOSE, FD_CONNECT, FD_READ und FD_WRITE abgefangen und mittels eines Hooks lasse ich dann Messages an meine Hauptform senden. Diese Hauptform untersucht die eingegangenen Nachrichten und wenn es eine WinSockMsg ist (Basiswert 10025) dann wird entsprechender Code angewendet.
Hier ist der Code :
Leider friert mir meine Anwendung aber ein. Ich kann zwar noch Verbindungen eingehen und es werden auch Daten empfangen, aber ich kann die Anwendung nicht mehr beenden oder sonstwie steuern.
Weiß jemand Rat ?
Danke und liebe Grüße,
Pascal
P.S.: Ich fände es gut wenn man ein eigenes API-Forum einrichten könnte, denn dieses Thema hier passt nirgendwo so recht hin. Nur als kreativer Vorschlag...
Hier ist der Code :
Code:
Public Function ConnectToClient()
Dim lngRetConnect As Long
Dim struct_sckAddr As sockaddr_in
Dim lngRetSocketStart As Long
With struct_sckAddr
.sin_addr = lngLocalIP
.sin_family = AF_INET
.sin_port = htons(12350)
End With
lngRetSocketStart = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
lngRetConnect = connect(lngRetSocketStart, struct_sckAddr, LenB(struct_sckAddr))
If lngRetConnect = SOCKET_ERROR Then
MsgBox "No connection possible.", vbCritical, "An error occured"
ElseIf lngRetConnect <> SOCKET_ERROR Then
WSAAsyncSelect lngRetSocketStart, frmClient.hwnd, WINSOCKMSG, FD_ACCEPT Or FD_CLOSE Or FD_CONNECT Or FD_READ Or FD_WRITE
lngConnectedSocket = lngRetSocketStart
HookForm frmClient
End If
End Function
Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
If PrevProc <> 0 Then
SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
PrevProc = 0
End If
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WINSOCKMSG Then
ProcessMessage wParam, lParam
Else
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
End If
End Function
Public Function ProcessMessage(ByVal wParam As Long, ByVal lParam As Long)
Select Case lParam
Case FD_READ
frmClient.lstSockMessages.AddItem "Socket has Data to read"
GetSocketData
Case FD_CONNECT
frmClient.lstSockMessages.AddItem "Socket connected"
Case FD_CLOSE
UnHookForm frmClient
Case FD_WRITE
frmClient.lstSockMessages.AddItem "Socket has Data to write."
SendDataToSocket
Case Else
frmClient.lstSockMessages.AddItem "Nr. " & wParam
frmClient.lstSockMessages.AddItem lParam
End Select
End Function
Leider friert mir meine Anwendung aber ein. Ich kann zwar noch Verbindungen eingehen und es werden auch Daten empfangen, aber ich kann die Anwendung nicht mehr beenden oder sonstwie steuern.
Weiß jemand Rat ?
Danke und liebe Grüße,
Pascal
P.S.: Ich fände es gut wenn man ein eigenes API-Forum einrichten könnte, denn dieses Thema hier passt nirgendwo so recht hin. Nur als kreativer Vorschlag...