Guten Morgen zusammen,
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
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 :
Quellcode
- 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