Netzwerk GetClientPort(ClientID)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Hallo,
Was gibt mir

Code: Alles auswählen

GetClientPort(ClientID)
wobei ClientID = EventClient() ist.
überhaupt zurück bzw. was kann man damit anfangen ?

In den Beispielen ist ja Port = 6832 eingestellt. Obiges
gibt mir aber eine andere 5-stellige Nummer zurück.

Dreht sich halt darum, ob ich die Portnummer evtl. auch
variabel gestalten könnte. D.H. Wenn mein Programm auf
dem Tablet PC startet, meldet mein auch gestartetes
PB-Programm einen neuen Clienten.

Wenn das ginge, könnte mein Kunde sein Prog. fürs Tablet
selber gestalten bzw. den Port frei wählen.
PB 6.10
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Ich hätte da noch eine Frage :
Mit diesem Code kann ich prima an mein
Android-Gerät senden :

Code: Alles auswählen

Procedure Senden()
  Protected text1.s{100}, text2.s{80}, text3.s{80}, text4.s{80} 
  Protected i.l, res.l, Result.l, *Puffer.l
  Protected Send.s
  
  *Puffer = AllocateMemory(343)
  For i = 0 To GetLines(lv1) - 1
    res = GetItemText(lv1, @text1, 0, i)
    res = GetItemText(lv1, @text2, 1, i)
    res = GetItemText(lv1, @text3, 2, i)
    res = GetItemText(lv1, @text4, 3, i)
    Send = text1 + "," + text2 + "," + text3 + "," + text4  
    FillMemory(*Puffer, 343)
    PokeS(*Puffer, Send, Len(Send), #PB_UTF8) 
    Send = PeekS(*Puffer, Len(Send), #PB_UTF8)
    Result = SendNetworkData(ClientID, *Puffer, Len(Send))
    
 Next
 FreeMemory(*Puffer)
 CloseNetworkServer(0) 
EndProcedure
Das ganze funktioniert aber nur, wenn ich am Ende
mit CloseNetworkServer(0) die Verbindung schließe.
Erst dann kommen die Daten an. Geht das auch anders,
damit ich die Verbindung offen halten kann ?
PB 6.10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Netzwerk GetClientPort(ClientID)

Beitrag von ts-soft »

Deine Frage kann ich jetzt nicht beantworten, aber ein paar ungereimtheiten Deiner Procedure habe
ich beseitigt:

Code: Alles auswählen

Procedure Senden()
  Protected text1.s{100}, text2.s{80}, text3.s{80}, text4.s{80}
  Protected i.l, Result.l, *Puffer
  Protected Send.s
  
  *Puffer = AllocateMemory(343)
  For i = 0 To GetLines(lv1) - 1
    GetItemText(lv1, @text1, 0, i)
    GetItemText(lv1, @text2, 1, i)
    GetItemText(lv1, @text3, 2, i)
    GetItemText(lv1, @text4, 3, i)
    Send = text1 + "," + text2 + "," + text3 + "," + text4 
    FillMemory(*Puffer, 343)
    PokeS(*Puffer, Send, -1, #PB_UTF8)
    ;Send = PeekS(*Puffer, Len(Send), #PB_UTF8) überflüssig
    Result = SendNetworkData(ClientID, *Puffer, StringByteLength(Send, #PB_UTF8))
    
  Next
  FreeMemory(*Puffer)
  CloseNetworkServer(0)
EndProcedure
Ich hoffe mal, durch Nachschlagen in der Hilfe verstehst Du meine Änderungen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Seltsam,
wenn ich deinen geänderten Code ausführe,
wird der letzte Datensatz (also der letzte String)
nicht auf mein Gerät gesendet.
PB 6.10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Netzwerk GetClientPort(ClientID)

Beitrag von ts-soft »

Dann fehlt wohl das Nullbyte. Ich kann es ja nicht testen:

Code: Alles auswählen

Result = SendNetworkData(ClientID, *Puffer, StringByteLength(Send, #PB_UTF8) + 1)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Klappt auch nicht.
Ich belasse es jetzt mal bei meiner
funktionierenden Version. Ist ja auch
nicht immer einfach, 2 Betriebssysteme
(Windows + Android) zum Zusammenarbeiten
zu bringen.

Was ich ursprünglich mit einer permanenten
Verbindung wollte :

Mit meinem PB-Programm bearbeite ich meine
Datenbank. Wenn ein #PB_NetworkEvent_Connect
vorliegt, sendet es den Inhalt meines Listviews.
Es kann dann natürlich vorkommen, daß mehrmals
von meinem Gerät connected wird und nicht nur einmal.
Deshalb hätte ich gerne die Verbindung offen gehalten.
Schade, daß es dafür keine Funktion wie etwa FlushNetworkBuffer()
gibt, der dann alles schreibt /sendet.

Ich probiere mal von meinem Gerät ein Disconnect.
Mal sehen, ob ich dann den ganzen Datenstrom erhalte.
PB 6.10
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Netzwerk GetClientPort(ClientID)

Beitrag von Kiffi »

<vermutung>
auf Android-Seite könnte ein 'Connection: close' helfen?
</vermutung>

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Hab mir grad mal zum Test eine GUI als
Client gemacht. Klappt aber auch nicht
so richtig. Evtl. hab ich auch was falsch
gemacht.

Code: Alles auswählen

Global Quit.l, Port.l, conID.l, status.l, cEvent.l, Result.l, *DataBuffer.l

*DataBuffer = AllocateMemory(343)

If OpenWindow(0, 10, 10, 500, 320, "Client", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
       ButtonGadget(1,5, 10,100, 20, "Ende")
       ButtonGadget(2,120, 10, 100, 20, "Connect")
       ButtonGadget(3,235, 10, 140, 20, "Disconnect")
       StringGadget(4, 10, 60, 350, 120, "")
       
       Quit = 0
       Port = 6832
       status = 0
       If InitNetwork() = 0
         MessageRequester("Info", "Kein Netzwerk !", #PB_MessageRequester_Ok)
         End
       EndIf
       
   Repeat
    EventID.l = WaitWindowEvent()
    Select EventID
       Case #PB_Event_CloseWindow
          Quit = 1
       Case #PB_Event_Gadget 
         Select EventGadget()    
            Case 1
               ; Ende - Button gedrückt
               Quit = 1
            Case 2
             ; Connect - Button gedrückt
             conID = OpenNetworkConnection("127.0.0.1", Port)
             If conID
               status = 1
               ;MessageRequester("Info", "Connect !", 0)
               cEvent = NetworkClientEvent(conID)
               If cEvent = #PB_NetworkEvent_Data
                   FillMemory(*DataBuffer, 343)
                   Result = ReceiveNetworkData(ConID, *DataBuffer, 343) 
                   SetGadgetText(4, PeekS(*DataBuffer, 343))
                  
               EndIf  
             EndIf
           Case 3
             ;Disconnect
             If status <> 0
               CloseNetworkConnection(conID)
               status = 0
             EndIf
       EndSelect
    EndSelect
   Until Quit = 1 Or EventID = #PB_Event_CloseWindow
 EndIf
 FreeMemory(*DataBuffer)
End
PB 6.10
Benutzeravatar
inSANE
Beiträge: 5
Registriert: 16.11.2010 17:16

Re: Netzwerk GetClientPort(ClientID)

Beitrag von inSANE »

Hallo Heinz,

so wie Deine Client aufgebaut ist, wäre es sehr unwahrscheinlich dass Du damit Daten empfängst, denn Du fragst die Daten ja nur DIREKT nach dem Öffnen der Connection ab - aber niemals mehr danach.

Genau wie Windows-Events müssen Netztwerk-Events jedoch permanent (z.B. in der Window-Event Schleife oder einem Thread) abgefragt werden, da man ja nie den Zeitpunkt weiß, WANN sie auftreten.

Anbei mal eine kleine Abänderung Deines Clients, so wie er evtl. funktionieren könnte (ist jedoch ungetestet, da ich ja Deinen Server nicht habe):

Code: Alles auswählen

Global Quit.l, Port.l, conID.l, status.l, cEvent.l, Result.l, *DataBuffer.l

*DataBuffer = AllocateMemory(343)

If OpenWindow(0, 10, 10, 500, 320, "Client (kann auch mehrfach gestarted werden)", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	ButtonGadget(1,5, 10,100, 20, "Ende")
	ButtonGadget(2,120, 10, 100, 20, "Connect")
	ButtonGadget(3,235, 10, 140, 20, "Disconnect")
	EditorGadget(4, 10, 40, 480, 270)
	
	SetGadgetText(4, "Dieser Client kann auch mehrfach gestartet werden um damit"+#CR$+"mehrere, gleichzeitige Verbindungen zum Server auf zu bauen.")
	
	Quit = 0
	Port = 6832
	status = 0
	If InitNetwork() = 0
		MessageRequester("Info", "Kein Netzwerk !", #PB_MessageRequester_Ok)
		End
	EndIf
	
	Repeat
		
		; ----- Window-Events bearbeiten
		
		EventID.l = WaitWindowEvent(10)  ;  <===== Timeout ist wichtig, damit auch die NetzwerkEvents permanent ausgewertet werden können.
		
		Select EventID
			Case #PB_Event_CloseWindow
				Quit = 1
			Case #PB_Event_Gadget 
				Select EventGadget()    
					Case 1
						; Ende - Button gedrückt
						Quit = 1
					Case 2
						; Connect - Button gedrückt
						
						If Not status
							conID = OpenNetworkConnection("127.0.0.1", Port)
							If conID
								status = 1
								SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connected -" + #CR$)
								; 	;MessageRequester("Info", "Connect !", 0)
								; 	cEvent = NetworkClientEvent(conID)
								; 	If cEvent = #PB_NetworkEvent_Data
								; 		FillMemory(*DataBuffer, 343)
								; 		Result = ReceiveNetworkData(ConID, *DataBuffer, 343) 
								; 		SetGadgetText(4, PeekS(*DataBuffer, 343))
								; 		
								; 	EndIf  
							EndIf
						EndIf
					Case 3
						;Disconnect
						If status <> 0
							CloseNetworkConnection(conID)
							status = 0
							SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connection closed -" + #CR$)
						EndIf
				EndSelect
		EndSelect
		
		; ----- Netztwerk-Events bearbeiten
		
		If status
			
			cEvent = NetworkClientEvent(conID)
			
			Select cEvent
					
				Case #PB_NetworkEvent_Data
					
					Repeat
						Result = ReceiveNetworkData(ConID, *DataBuffer, 343) 
						SetGadgetText(4, GetGadgetText(4) + PeekS(*DataBuffer, Result))
					Until Result < 343  ; Until Received Network Data smaller than Buffersize
					
			EndSelect
			
		EndIf
		
	Until Quit = 1 Or EventID = #PB_Event_CloseWindow
EndIf
FreeMemory(*DataBuffer)
End
[EDIT]: Hab noch schnell 'nen kleinen Server gebastelt um's zu testen.
Scheint alles so zu funktionieren wie es soll. ;)

Server:

Code: Alles auswählen

EnableExplicit

InitNetwork()

NewList ConnectedClients.i()

Define Event, NetEvent, NetClient, Connected, n

If Not CreateNetworkServer(0, 6832 , #PB_Network_TCP)
	Debug "Netzwerk-Server konnte nicht eingerichtet werden"
	End
EndIf

OpenWindow(0,0,0,280,100, "Netzwer-Server", #PB_Window_ScreenCentered | #PB_Window_SystemMenu )
EditorGadget(0,5,5, 190,65)
ButtonGadget(1,5,76,190,20, "Senden")
ListIconGadget(2,200,5,75,90,"Clients",71)

SetGadgetText(0, "Test-Text !!!" + #CR$)
StickyWindow(0, #True)

Repeat
	
	Event = WaitWindowEvent(10)
	
	Select Event
			
		Case #PB_Event_Gadget
			
			If EventGadget() = 1
				
				ForEach ConnectedClients()
					SendNetworkString(ConnectedClients(), GetGadgetText(0))
				Next
				
			EndIf
			
	EndSelect
	
	NetEvent = NetworkServerEvent()
	
	Select NetEvent
			
		Case #PB_NetworkEvent_Connect
			
			NetClient = EventClient()
			
			AddElement(ConnectedClients())
			ConnectedClients() = NetClient
			
			AddGadgetItem(2,-1, Str(NetClient))
			
		Case #PB_NetworkEvent_Disconnect
			
			NetClient = EventClient()
			
			; ----- Client aus LinkedList der verbundenen Clients entfernen
			
			ForEach ConnectedClients()
				If ConnectedClients() = NetClient
					DeleteElement(ConnectedClients())
					Break	
				EndIf
			Next
			
			; ----- Client aus ListIconGadget entfernen
			
			For n = 1 To CountGadgetItems(2)
				If Val(GetGadgetItemText(2, n-1, 0)) = NetClient
					RemoveGadgetItem(2, n-1)
					Break
				EndIf
			Next
			
	EndSelect
	
	
Until Event = #PB_Event_CloseWindow

ForEach ConnectedClients()
	SendNetworkString(ConnectedClients(), #CR$+"- Server closed -")
Next

CloseNetworkServer(0)
Gruß und viel Erfolg. ;)
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Netzwerk GetClientPort(ClientID)

Beitrag von H.Brill »

Dankeschön,
damit kann ich was anfangen.
Dann werde ich mal meinen Code
ein wenig umbauen.

Edit : Klappt soweit, aber noch nicht richtig
beim Androidgerät.
Nun habe ich auch Gewissheit, daß beim
PB-Programm alles richtig ist. Muß dann nur
noch beim Basic4Android - code nachbessern.
PB 6.10
Antworten