Seite 1 von 3

server kann keine datei empfangen wenn mehrere clienten da s

Verfasst: 28.11.2010 21:46
von shutdown27
mein server kann aus irgendeinem grund keine datei empfangen wenn ein weiterer client im selben moment irgendwas sendet (string
oder so)
also einen fehler oder so bekomme ich nicht aber das
NetworkServerEvent() bleibt bei #PB_NetworkEvent_File
so bekomme ich in meinem code die ganze zeit die meldung das ein client eine datei geschickt hat und ich muss den client beenden um es abzubrechen

kann ich das beheben oder umgehen?

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 28.11.2010 23:39
von Xaby
Du wolltest gern wissen,

wie ein Code aussehen sollte, damit du gleichzeitig Dateien von mehreren Clients empfangen kannst.
Ich denke, ein beliebter Fehler ist eventuell, dass die Connection-ID nicht stimmt und du eventuell bei ReceiveNetworkFile(Verbindung, DateiName$)
den gleichen DateiNamen und überschreibst gleichzeitig die Datei oder aber du hast aus Versehen die selbe Verbindung und störst damit das Vorhaben.

Ich kann nur Mutmaßen :shock:

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 02:04
von STARGÅTE
Code bitte!

Ansonsten können wir nicht detailiert weiterhelfen.

Zur Clientunterscheidung gibt es auf der Serverseite: EventClient()

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 19:00
von shutdown27
stargate: ja weis ich ich habe schon ein gadget mit allen clients und so sachen
xaby: ums gleichzeitige datei empfangen gehts nicht es geht überhaupt um das empfangen einer datei wenn in dem moment des downloads aber ein andere client einen string sendet oder connected funktionierts halt nicht

hier mal ein wenig code futter

Code: Alles auswählen


SEvent = NetworkServerEvent()   
    ClientID = EventClient()
    If SEvent
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          PrintL( "A new client has connected !")
          AddGadgetItem(12, -1, Str(ClientID))
          AddGadgetItem(13, -1, "("+Str(ClientID)+")")
         
  
        Case #PB_NetworkEvent_Data         
          ReceiveNetworkData(ClientID, *Buffer, 5000)
          LastName=PeekS(*Buffer)
          PrintL(NameForID(ClientID)+": "+LastName)
          If Mid(LastName,1,6)="ORDNER"
            CreateDirectory("C:\Users\Peter\Desktop\rofl\"+Str(ClientID)+"\"+Mid(LastName,7))
          ElseIf Mid(LastName,1,8)="TREEFILE"
            pos=FindString(LastName,"|",1)
            
            AddGadgetItem(1, -1, Mid(LastName,pos+1), 0, Val(Mid(LastName,9,pos-9)))

           
          ElseIf Mid(LastName,1,10)="TREEORDNER"
            pos=FindString(LastName,"|",1)
            
            AddGadgetItem(1, -1, Mid(LastName,pos+1), 0, Val(Mid(LastName,11,pos-11)))
          ElseIf Mid(LastName,1,2)="13"
            SendNetworkString(ClientID, "wait")
          EndIf  
          FillMemory(*Buffer, 5000)
          ;Debug LastName
          
        Case #PB_NetworkEvent_File
          PrintL( "Client "+Str(ClientID)+" has send a file via the network !")
          CreateDirectory("C:\Users\Peter\Desktop\rofl\"+Str(ClientID))
          
                   
          If LastName="files.txt"
            DeleteFile("C:\Users\Peter\Desktop\rofl\"+Str(ClientID)+"\files.txt")   
            LastName=""
            If ReceiveNetworkFile(ClientID, "C:\Users\Peter\Desktop\rofl\"+Str(ClientID)+"\files.txt")
            If ReadFile(0, "C:\Users\Peter\Desktop\rofl\"+Str(ClientID)+"\files.txt")
              While Not Eof(0)
                readed=ReadString(0)               
                  pos=FindString(readed,"|",1)                  
                  AddGadgetItem(1, -1, Mid(readed,pos+1), 0, Val(Mid(readed,1,pos)))                                    
              Wend
              CloseFile(0)              
                          
            EndIf
          Else
            MessageRequester("","rofl")
          EndIf
            ReceiveNetworkFile(ClientID, "C:\Users\Peter\Desktop\rofl\"+Str(ClientID)+"\"+GetFilePart(LastName))
          Else            
            If listdownload=1
              RemoveGadgetItem(8, 0)
              If CountGadgetItems(8)=0
                listdownload=0
              Else  
                SendNetworkString(ClientID, "SENDFILE"+GetGadgetItemText(8,0))
              EndIf  
            EndIf  
          EndIf  
        Case #PB_NetworkEvent_Disconnect          
          RemoveGadgetItem(13,FindGadgetItem(12,Str(ClientID)))
          RemoveGadgetItem(12,FindGadgetItem(12,Str(ClientID)))
          PrintL( "Client "+Str(ClientID)+" has closed the connection...")            
      EndSelect      
    EndIf    

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 19:43
von edel
Sendest du etwas an den Server, ist dieser erstmal damit beschaeftigt diesen auch zu
empfangen, der Server haengt dann erstmal bei ReceiveNetworkData. Und zwar solange
bis er damit fertig ist.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 19:45
von shutdown27
ja das ist anscheinend das problem aber solange alle anderen clienten ruhig sind funktioniert es ja :)

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 19:47
von HeX0R
edel hat geschrieben:Sendest du etwas an den Server, ist dieser erstmal damit beschaeftigt diesen auch zu
empfangen, der Server haengt dann erstmal bei ReceiveNetworkData. Und zwar solange
bis er damit fertig ist.
Ich schätze du meintest ReceiveNetworkFile().
Das ist auch der Grund, warum man das nicht wirklich verwenden sollte.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 20:15
von STARGÅTE
Wenn du wirklich große Dateien bzw. großen Mengen Daten verschicks,
dann musst du entweder Threads benutzen,
um das lange brauchende ReceiveNetworkFile auszulagern und NetworkServerEvent() nicht zu blockieren.
Oder du versendest die Dateien als Daten,
und empfängst auf der Serverseite die Dateien nur stückchenweise mit ReceiveNetworkData(),
sodass du dort oft genug NetworkServerEvent() aufrufen kannst, und die Ressourcen gleichmäßig verteils ...

Noch ein Hinweis:
Netzwerk-Daten-Übertragung ist immer wieder Gesprächsthema.
Benutze einfach die Suche des Forums, um weiterführende Infos und Tips und Code zu bekommen.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 20:17
von edel
Eigentlich meinte ich ReceiveNetworkData, es nutzen doch beide die gleiche API?

Aber ich seh gerade das es sich irgendwie um 2 Fehlerbeschreibungen handelt. Oder ich hab den Wursttext falsch verstanden ;)

Aber wenn es bei #PB_NetworkEvent_File haengen bleibt, heisst das ja, das nicht alle Daten empfangen wurden und der Server noch darauf wartet.

Das Problem kann man dann hier schoen sehen :

Server.pb

Code: Alles auswählen

PROCEDURE Main()
  
  InitNetwork()
  OpenConsole()
  
  sid = CreateNetworkServer(0, 4321)
  
  IF sid
    
    PrintN("SERVER START")
    
    REPEAT
      event = NetworkServerEvent()
      
      SELECT event
        CASE #PB_NetworkEvent_Connect
          PrintN("CONNECT")
        CASE #PB_NetworkEvent_Disconnect
          PrintN("DISCONNECT")
        CASE #PB_NetworkEvent_Data
          ;ReceiveNetworkData(EventClient(), @long, 4)
          PrintN("DATA")
      ENDSELECT
      
      
      Delay(1)      
    FOREVER       
    
  ENDIF
  
ENDPROCEDURE:Main()

client.pb

Code: Alles auswählen

PROCEDURE Main()
  
  InitNetwork()
  
  cid = OpenNetworkConnection("127.0.0.1", 4321)
  
  
  IF cid 
    
    SendNetworkString(cid, Space(1))
    
    Delay(4000)
    
  ENDIF
  
ENDPROCEDURE:Main()
Entfernt man, bei dem Server, das Semikolon vor ReceiveNetworkData, funktioniert es sauber.

Re: server kann keine datei empfangen wenn mehrere clienten

Verfasst: 29.11.2010 20:26
von shutdown27
ich habe eine idee wenn ich

Code: Alles auswählen

repeat
until ReceiveNetworkFile(ClientID, "C:\"+GetFilePart(LastName))
sollte das klappen?

EDIT: hat nicht geklappt seber fehler wie vorher