server kann keine datei empfangen wenn mehrere clienten da s

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von HeX0R »

deify hat geschrieben: :o ich meine, so würde er doch nur die pointer-addresse verschicken oder? der client hat doch zu 100% komplett andere Daten an diesem Pointer, oder nicht?
Nein, so würde er die Pointer-Adresse verschicken:

Code: Alles auswählen

@*Send
Aber es geht trotzdem nicht, weil Strings in Strukturen höchstens als fixed Strings funktionieren würden.
Dann hat man natürlich den Nachteil, dass das Paket immer gleich gross ist, egal ob man nun nur ein A, oder ein Buch senden will.

Hier mal ein nicht lauffähiges Konzept, mithilfe meiner weiter oben geposteten Beispielstruktur:

Code: Alles auswählen

Structure _MY_SEND_MSG_
  LengthOfData.l
  KindOfPaket.w
  *Data
EndStructure

*Send._MY_SEND_MSG_ = AllocateMemory($10000)

;Wir senden ein Hallo, Welt
Text$ = "Hallo, Welt!"
*Send\KindOfPaket = 1 ;<- Chat msg
*Send\LengthOfData = StringByteLength(Text$, #PB_UTF8) + 1 ;<- Am besten immer im UTF8-Format senden, und nicht das abschliessende Nullbyte vergessen
;Sodele, nun nur noch den Text als *Data anhängen:
PokeS(*Send + OffsetOf(_MY_SEND_MSG_\Data), Text$, -1, #PB_UTF8)
;Dann versenden
SendNetworkData(ClientID, *Send, *Send\LengthOfData + OffsetOf(_MY_SEND_MSG_\Data))
;Bemerkung:
;Wenn man mit OffsetOf() arbeitet, hat es den Vorteil, das der Code auch dann funktioniert, wenn man in die
; _MY_SEND_MSG_-Struktur noch Felder einfügen muss.
; Allerdings muss *Data IMMER am Ende stehen!

;Beim Empfänger, zupft man das Paket einfach wieder raus:
*Receive._MY_SEND_MSG_ = AllocateMemory($10000)
R = ReceiveNetworkData(ClientID, *Receive, $10000)
If R > OffsetOf(_MY_SEND_MSG_\Data)
	;O.k., wir haben mindestens ein Paket, ohne *Data
	If *Receive\LengthOfData + OffsetOf(_MY_SEND_MSG_\Data) <= R
		;O.k., Paket ist vollständig
		Select *Receive\KindOfPaket
			Case 1
				;Chat-Msg
				Text$ = PeekS(*Receive + OffsetOf(_MY_SEND_MSG_\Data), -1, #PB_UTF8) ;Da wir das Nullbyte mitgesendet haben, lesen wir einfach bis dort.
				Debug Text$
				
				;....

shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von shutdown27 »

ich habe das nochnmal probiert ohne strings
und siehe da es geht :)
aber wenn ich etwas sende kommt das gesendete und noch 5 andere packete an die aber alle nur nullen
enthalten

ich lasse mir die daten per debuger imer anzeigen
hier der log:

Code: Alles auswählen

Server created (Port 25565).
A new client has connected !
Client 32841264 has send a packet !
1
56
234234
0
0
0
Client 32841264 has send a packet !
0
0
0
0
0
0
Client 32841264 has send a packet !
0
0
0
0
0
0
Client 32841264 has closed the connection...
shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von shutdown27 »

habe jetzt einfach überprüft ob die daten 0 betragen oder nicht
wenn ich aber jetzt eine simple txt datei sende
kommen auf der anderen seite nur chinesiche zeichen raus

hier die 2 kompletten quelcodes
client

Code: Alles auswählen

Structure SendStruct
  Code.l
  Nummer.w
  *Data
EndStructure  

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf


Port = 25565
*Send.SendStruct = AllocateMemory(32100)
*Send\Data       = AllocateMemory(32100)
;InitializeStructure(*Send, SendStruct)

*Send\Code=1
*Send\Nummer=56


File$ = OpenFileRequester("Bitte Datei zum Laden auswählen", "", "Alle Dateien (*.*)|*.*",0)
If OpenFile(0,File$)
  Debug Lof(0)
  ReadData(0,*Send\Data,32100)
EndIf
  CloseFile(0)
  
;*Send\Data=234234
;CopyMemory(*Datei,*Send\Data,32100)

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID  
  ;Debug "Client connected to server..."  
  ;Debug *Send\Code
  ;Debug *Send\Nummer
  ;Debug *Send\Data
  
  SendNetworkData(ConnectionID,*Send,32100)    
  ;Debug "A string has been sent to the server, please check it before quit..."  
  CloseNetworkConnection(ConnectionID)
  
Else  
  Debug "Can't find the server (Is it launched ?)."
EndIf
  
End   
SERVER:

Code: Alles auswählen

Structure SendStruct
  Code.l
  Nummer.w
  *Data
EndStructure  


If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 25565
*Buffer.SendStruct = AllocateMemory(32100)
*Buffer\Data       =AllocateMemory(32100)
;InitializeStructure(*Buffer, SendStruct)
If CreateNetworkServer(0, Port)

  ;MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  Debug "Server created (Port "+Str(Port)+")."
  Repeat
      
    SEvent = NetworkServerEvent()
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          ;MessageRequester("PureBasic - Server", "A new client has connected !", 0)
          Debug "A new client has connected !"
      
        Case #PB_NetworkEvent_Data
          ReceiveNetworkData(ClientID, *Buffer.SendStruct, 32100)
          If *Buffer\Code<>0
            Debug "Client "+Str(ClientID)+" has send a packet !"
            ;Debug "String: "+PeekS(*Buffer)
            
            
            Debug *Buffer\Code
            Debug *Buffer\Nummer
            Debug *Buffer\Data        
            OpenFile(0,"lolol.txt")
            WriteData(0,*Buffer\Data,32100)
            CloseFile(0)
            ;*Receive.SendStruct  = AllocateMemory(32100)
            ;InitializeStructure(*Buffer, SendStruct)
            
            ;CopyStructure(@*Buffer, @*Receive, SendStruct)
            ;CopyMemory(*Buffer, *Receive, 32100)
            
            ;Debug *Receive\Code
            ;Debug *Receive\Nummer
            ;Debug *Receive\Data         
          EndIf
        Case #PB_NetworkEvent_File
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          Debug "Client "+Str(ClientID)+" has send a file via the network !"
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case #PB_NetworkEvent_Disconnect
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Debug "Client "+Str(ClientID)+" has closed the connection..."
          ;Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

  
End   


shutdown27
Beiträge: 15
Registriert: 28.08.2010 15:58
Kontaktdaten:

Re: server kann keine datei empfangen wenn mehrere clienten

Beitrag von shutdown27 »

endlich es hat geklappt :)

großen dank an alle die geholfen habe besonders HeX0R

:bounce:
Antworten