Seite 1 von 1

Network Events werden nicht verarbeitet

Verfasst: 16.05.2007 01:22
von Jake
Aus dem Codearchiv habe ich folgende Codes:

Server:

Code: Alles auswählen

; English forum:  
; Author: freak (updated for PB4.00 by blbltheworm)
; Date: 21. January 2003 
; OS: Windows 
; Demo: No 
 

; ++++++++++++++++++++++++  Network Server Example +++++++++++++++++++++++++++++++

OpenWindow(0,0,0,300,80, "Network Server", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
;von freak
; ++++++++++++++++++++++++  Network Server Example +++++++++++++++++++++++++++++++


CreateGadgetList(WindowID(0))
StringGadget(0, 5, 5, 290, 25, "")
ButtonGadget(1, 5, 40, 80, 25, "Send")
DisableGadget(1,1)

If InitNetwork() = 0: End: EndIf                       ; Initialize Network Stuff
Socket.l = CreateNetworkServer(#PB_Any,6000) 
If Socket = 0: End: EndIf

; The following call will activate this Trick
;
; Socket      : Socket (or Connection ID) is returned by CreateNetworkServer()
; WindowID()  : ID of a Window, to send the Events to.
; #WM_NULL    : The Message to be Send, if a Network Event occurs.
;               #WM_NULL will be ignored, but still causes the WaitWindowEvent() to return,
;               and then the NetworkEvent to be called.
; #FD_ALL     : Event to be send to Callback Procedure, we request them all.

#FD_ALL = #FD_READ|#FD_WRITE|#FD_OOB|#FD_ACCEPT|#FD_CONNECT|#FD_CLOSE
WSAAsyncSelect_(Socket, WindowID(0), #WM_NULL, #FD_ALL) 


;Main Loop

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadget() = 1
        Text.s = GetGadgetText(0)
        SendNetworkData(EventClient(), @Text, Len(Text)+1)
      EndIf
  EndSelect
  
  Select NetworkServerEvent()
    Case 1
      DisableGadget(1,0)    ; user connected, enable sending.
    Case 4
      DisableGadget(1,1)    ; user disconnected, disable sending.
  EndSelect
ForEver


; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
Client:

Code: Alles auswählen

; English forum: 
; Author: freak (updated for PB4.00 by blbltheworm)
; Date: 21. January 2003
; OS: Windows
; Demo: No


; ++++++++++++++++++++++++  Network Client Example +++++++++++++++++++++++++++++++

OpenWindow(0, 0, 0, 300, 400, "Network Client", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ListViewGadget(1, 5, 5, 290, 390)

If InitNetwork()=0: End: EndIf                       ; Initialize Network Stuff
ConnID.l = OpenNetworkConnection("127.0.0.1",6000)
If ConnID = 0: End: EndIf

; The following call will activate this Trick
;
; ConnID      : connection ID (from OpenNetworkConnection)
; WindowID()  : ID of a Window, to send the Events to.
; #WM_NULL    : The Message to be Send, if a Network Event occurs.
;               #WM_NULL will be ignored, but still causes the WaitWindowEvent() to return,
;               and then the NetworkEvent to be called.
; #FD_ALL     : Event to be send to Callback Procedure, we request them all.

#FD_ALL = #FD_READ|#FD_WRITE|#FD_OOB|#FD_ACCEPT|#FD_CONNECT|#FD_CLOSE
WSAAsyncSelect_(ConnID, WindowID(0), #WM_NULL, #FD_ALL) 


; Main Loop

Repeat
  If WaitWindowEvent() = #PB_Event_CloseWindow
    End
  EndIf
  If NetworkClientEvent(ConnID) = 2
    Text.s = Space(500)
    ReceiveNetworkData(ConnID, @Text, 500)
    AddGadgetItem(1,-1,Text)  
  EndIf
ForEver



; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
Wenn ich nun eine Nachricht zum Client schicke wird diese erst angezeigt wenn ich ein WindowEvent erzeuge (z.B. Maus über das Fenster bewegen).
Im Code steht doch das der Befehl WSAAsyncSelect bei einem auftretenden Netzwerkevent ein #WM_NULL an das Fenster sendet, und somit das Netzwerkevent verarbeitet wird.
Warum funktioniert das nicht?

Nachtrag:
Ich habe mir die WindowEvent's und die ServerEvent's im Debuger anzeigen lassen. Dabei ist mir aufgefallen das nur beim ersten Server- / ClientEvent ein #WM_NULL gesendet wird. Wenn ich statt des WSAAsyncSelect Befehls einen Timeout bei WaitWindowEvent() angebe, klappt alles wunderbar.

Verfasst: 21.05.2007 21:45
von Scarabol
Hallo

Dann mach das doch so wie in deinem Nachtrag beschrieben und alles ist in Butter oder nicht?

Gruß
Scarabol

Verfasst: 29.05.2007 09:06
von edel
Dann waere aber WSAAsyncSelect ueberfluessig.
Der Fehler liegt an der ID. WSAAsyncSelect benoetigt die Socket Nummer,
diese wird hier aber gar nicht uebergeben.

Aendere mal folgendes :
Client

Code: Alles auswählen

WSAAsyncSelect_(ConnectionID(ConnID), WindowID(0), #WM_NULL, #FD_ALL)
Server

Code: Alles auswählen

*Socket.long = CreateNetworkServer(#PB_Any,6000)

If *Socket = 0: End: EndIf

#FD_ALL = #FD_READ|#FD_WRITE|#FD_OOB|#FD_ACCEPT|#FD_CONNECT|#FD_CLOSE
Debug WSAAsyncSelect_(*Socket, WindowID(0), #WM_NULL, #FD_ALL)
Bei der ConnectionID des Server geht der Befehl ConnectionID() nicht ,
oder zumindest bekommt man da nicht den Socket zurueck (was beim
Client wunderbar klappt), deswegen hier mit Pointer. Kann aber auch sein
das ich nen Befehl uebersehen habe. :D


Hier noch einmal ein funktionierendes Server Beispiel:

Code: Alles auswählen

InitNetwork()

Procedure StartServer(hWnd,port)
  *server.long =CreateNetworkServer(#PB_Any,port) 
  If Not WSAAsyncSelect_(*server\l,hWnd,#WM_NULL,#FD_READ|#FD_WRITE|#FD_OOB|#FD_ACCEPT|#FD_CONNECT|#FD_CLOSE)
    ProcedureReturn *server
  EndIf
EndProcedure

Procedure Main()
  hWnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,320,280,"leer")
  
  CreateGadgetList(hWnd)
  ListViewGadget(0,10,10,300,260)
  
  *server = StartServer(hWnd,5674)
  
  If *server
    AddGadgetItem(0,0,"Server wurde gestartet")
  Else
    MessageRequester("","Server konnte nicht gestartet werden !")
    End
  EndIf
  
  Repeat
    event  = WaitWindowEvent()
    nevent = NetworkServerEvent()
    
    Select nevent
      Case #PB_NetworkEvent_Connect     : AddGadgetItem(0,0, "neuer Client") 
      Case #PB_NetworkEvent_Disconnect  : AddGadgetItem(0,0, "Client getrennt")
    EndSelect
    
  Until event = #PB_Event_CloseWindow
  
  CloseNetworkServer(*server)
  
EndProcedure:Main()

Verfasst: 02.06.2007 07:26
von Jake
Danke funktioniert super.

Was hat es mit dem long und \l auf sich. Warum geht das nur so und nicht mit *server.l statt *server.long und warum überhaupt der Pointer?
Was Gibt CreateNetworkServer() denn zurück?

Die Code-Beispiele hab ich direkt aus dem Codearchiv kopiert (sieht man ja).
Wäre gut wenn das dort auch geändert wird.

Verfasst: 02.06.2007 08:02
von edel
Jake hat geschrieben: Warum geht das nur so und nicht mit *server.l statt *server.long und warum überhaupt der Pointer?
Ohne die Struktur long kannst du nur noch ueber PeekL() auf
den Speicher zugreifen.
Jake hat geschrieben: CreateNetworkServer()
Muesste 'nen PBObjekt sein.