Seite 3 von 3

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 02.02.2011 23:22
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$
				
				;....


Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 03.02.2011 15:45
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...

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 03.02.2011 20:26
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   



Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 05.02.2011 22:51
von shutdown27
endlich es hat geklappt :)

großen dank an alle die geholfen habe besonders HeX0R

:bounce: