Seite 1 von 1

Das 1000ste Posting zum Thema PB_Network

Verfasst: 08.02.2005 14:26
von DataMiner
(Ich höre euch schon stöhnen, schon wieder so ein Depp...)

Eins vorweg: ich arbeite erst seit kurzem mit PB (Oktober 04). Daher möge man mir meine bescheuerten Fragen nachsehen.

Eigentlich, um zum Thema zu kommen, wollte ich eine schöne kleine Client-Server Applikation schreiben. Große Kommunikation findet nicht statt, es sollen nur vollautomatisch Dateien von Client zu Weiterverarbeitung auf den Server geschafft werden und Client davon in Kenntnis gesetzt werden das die Datei auch angekommen ist.
Wo ist jetzt das Problem? - Es heißt SendNetworkFile(ConnectionID, DateiName$) .
Egal wie groß oder klein die Datei ist - auf der Serverseite wird immer nur eine 0 kb große Datei erstellt ( bei einer CPU-Last von 100%) und der Server stellt darauf alle weiteren Tätigkeiten ein.
Die Datei wird mittels sehr spezieller (und sicherer) Methoden gesendet.
Vielleicht zu speziell?
Dann habe ich die letzten zwei Tage im deutschen und englischen Forum damit verbracht eine Lösung zu finden. Code gibt genug, nur keiner funktioniert bei mir beim Übertragen von Dateien. Mein Eindruck bei der Suche ist, es wurde 2002 mal ein Gerüst erstellt und jeder versucht sich mehr oder weniger erfolgreich daran die enthaltenen Fehler zu umgehen und mein Wissen reicht gerade mal aus AllocateMemory in den Codeschnipseln zu korrigieren.

Also meine Bitte:

hat jemand kommentierten Code für mich? Um gleich mal (unverschämterweise) ein Profil zu nennen:
1. Es sollen sich bis zu 100 Clients anmelden können und möglichst zeitnah ihre Dateien auf den Server übertragen.
2. Es muss sichergestellt sein das die Datei vollständig und intakt angekommen ist und der Client solange mit dem Senden weiterer Dateien wartet, bis das OK von Server kommt, oder das Senden wiederholt.
3. Die CPU-Last sollte -deutlich- unter 100% liegen.
4. Die Clients müssen sich authentifizieren (Benutzer/PW)

Wie müssten die Routinen aussehen, wenn man so mittels SendNetworkData das Ganze realisieren will??
:? :? :? :?

Verfasst: 08.02.2005 14:38
von Laurin
Pff... das ist aber nicht gerade wenig, was du forderst.

Von dem Code jetzt mal abgesehen: Bei dir laufen die ganzen anderen PB-Netzwerkprogramme, die du aufgestöbert hast nicht?

Vielleicht ist das Netzwerk bei dir falsch eingerichtet (hört sich echt danach an) und muss nun neu installiert werden. Was sagen denn andere Netzwerkprogramme zu deinem Netzwerk?

Greetz Laurin

Verfasst: 08.02.2005 14:40
von netfreak
Hallo,
ich beschäftige mich zurzeit auch mit der Netzwork Programmierung!
Also erstens du musst warten bis du in deinem Programm wieder was Klicken kannst den erst dann ist die Datei Vollkommen empfangen!

Aus der PB Hilfe:
Dieser Befehl blockiert die Programmausführung bis die komplette Datei gesendet wurde.

Und wegen der 100% Auslastung schau, dir das mal an:

http://www.robsite.de/php/pureboard/vie ... php?t=1963

EDit:

Um 100 Clienst mit dem Server zu verwalten schau dir den Code mal an:

Code: Alles auswählen


;Server 
NewList Client.l()  ;Hier wird eine Liste erstell wo süäter Alle Clients eingetragen werden

port = 600
InitNetwork() 
If CreateNetworkServer(Port) = 0
quit = 1
EndIf 

OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget,"Server") 
CreateGadgetList(WindowID()) 
ButtonGadget(1,390,340,100,20,"Senden") 
StringGadget(3, 10, 340, 370, 20, "") 
EditorGadget(2, 10, 10, 480, 300) 
Buffer = AllocateMemory(1000) 

Repeat 
  ;Fenster 
  EventID = WindowEvent() 
  If EventID = #PB_Event_CloseWindow 
    quit = 1 
  EndIf 
  If EventID = #PB_Event_Gadget 
    If EventGadgetID()=1 
      Text$ = GetGadgetText(3) 
      ForEach Client() 
        SendNetworkString(Client(), Text$) 
      Next
      AddGadgetItem(2, -1, Text$)
      SetGadgetText(3, "") 
    EndIf 
  EndIf 
  
  
  If EventID = 0 
    Delay(100) 
  EndIf 
  
  
  ;Server 
  SEvent.l = NetworkServerEvent() 
  
  ;SEvent 
  
  ClientID = NetworkClientID() 
  
  Select SEvent 
    
    Case 1 
      AddGadgetItem(2, -1, "Ein Neuer Chater ist online!") 
      AddElement(Client()) 
      Client() = ClientID  ; Hier wir der Neu Client in die liste eingetragen!
      
      ForEach Client()  ; HIer wird die Ganze Liste durchgegangen um an jeden Client zu senden
        If Client() <> ClientID 
          SendNetworkString(Client(), "Ein Neuer Chater ist online!")
          
        EndIf 
      Next 
     
      ;1: Ein neuer Client wurde mit dem Server verbunden 
      
    Case 2 
      MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0) 
      ReceiveNetworkData(ClientID, Buffer, 1000) 
      AddGadgetItem(2, -1, PeekS(Buffer)) 
      ForEach Client() 
        If Client() <> ClientID 
        Debug Client()
          SendNetworkString(Client(), PeekS(Buffer)) 
        EndIf 
      Next 
    
    Case 4 
      
     EndSelect 

  
Until quit=1 
;Speicher wider Frei geben!
FreeMemory(Buffer) 

End 
Das ist zwar ein Chat Server aber so wie es hier gemacht ist müsstest du es auch in deinem Programm machen!

Hoffe ich konnte Helfen!

mfg
Netfreak

Verfasst: 08.02.2005 15:26
von stbi
Zu dem Thema habe ich in dem oben verlinkten Thread schon ne Antwort geschrieben, ich gehe deshalb nicht näher auf SendNetworkFile() etc. ein, aber wenn Du sehr große Dateien versendest, könnte das Dein Problem sein.

Ich würde an Deiner Stelle den Atomic FTP-Server als Basis nehmen, es gibt genug Beispiele für FTP-Clients in PB. Dann bist Du unabhängig vom SendNetworkFile() und Dateigrößen.
Bei 100 Clients würde ich sogar den Server ggf. multithreaded auslegen, das kommt eben darauf an, mit welcher Gleichzeitigkeit Deine Clients connecten.

Gruß Stefan

Verfasst: 08.02.2005 19:39
von DataMiner
@ Laurin
Pff... das ist aber nicht gerade wenig, was du forderst.
-ich fordere nicht. Ich bitte. Ich will nur nicht das Rad wieder neu erfinden.
Von dem Code jetzt mal abgesehen: Bei dir laufen die ganzen anderen PB-Netzwerkprogramme, die du aufgestöbert hast nicht?
-stimmt so nicht. Sie laufen. Bis auf den Teil "Datei senden".
Vielleicht ist das Netzwerk bei dir falsch eingerichtet (hört sich echt danach an) und muss nun neu installiert werden. Was sagen denn andere Netzwerkprogramme zu deinem Netzwerk?
-sie sagen: ich fühle mich wohl hier *lol*. Spass bei Seite, ich richte von berufwegen MS-Netzwerke ein. Du kannst sicher sein das ich den Fehler erst mal bei mir gesucht habe. Ein Dumping des Traffics hat ergeben das das File sehrwohl gesendet wurde, aber eben von der "Server"-Seite nicht abgespeichert wird.

@netfreak
Das ist zwar ein Chat Server aber so wie es hier gemacht ist müsstest du es auch in deinem Programm machen!
Genau in den habe ich auch meine Hoffungen gesetzt. Es gibt ja den Befehl "send" bei dem Ding um Dateien zu senden. Die Datei wurde zwar in der richtigen Größe erstellt, aber ohne Inhalt. Wäre nett, wenn das noch einer testen könnte. Zu meinen Specs: Meine PB-Version ist 3.92. Mein Rechner ist ein P4 3.2GHz mit 1024MB-RAM und einem RAID5 Plattensystem mit 250GB. BS ist XPpro SP2.
Den Teil mit den Clients habe ich mir auch vorgenommen, jedoch (weiß nicht wieso) brach der Server mit einem "Out of Array" beim 100sten Client ab.
@stbi
Sorry, aber ich kann die Probleme mit SendNetworkFile/ReceiveNetworkFile nicht nachvollziehen, bei mir funktioniert das. Ich habe das gerade nochmal auf Basis der Beispiel-Programme ausprobiert - null problemo.
Da würde mich echt interessieren was du anders macht? Welches BS setzt du ein? Welche Beispiel-Programme meinst du? Die aus der Hilfe?

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

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

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
    
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
  
End   
; ExecutableFormat=Windows
; EOF
Wo wird denn hier eine Datei verschickt?
Ich würde an Deiner Stelle den Atomic FTP-Server als Basis nehmen, es gibt genug Beispiele für FTP-Clients in PB. Dann bist Du unabhängig vom SendNetworkFile() und Dateigrößen.
Ich glaube, darauf wird es hinauslaufen...

Erst einmal ein RIESEN DANKESCHÖN für eure Beiträge. Wenn jemand noch Codeschnipsel hat, ich bin für jede Anregung dankbar.

Gruß Dataminer

Verfasst: 09.02.2005 10:51
von stbi
hab nur den Client schnell abgeändert, dass er ne Datei verschickt und keinen String, am Server musste nix mehr machen:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

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

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  SendNetworkFile(ConnectionID, "C:\test.txt")
    
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
  
End   

Verfasst: 09.02.2005 11:04
von DataMiner
@stbi

DANKE! Habe das auch so ausprobiert.
ChaOsKid hat hier was schönes erstellt:
http://www.robsite.de/php/pureboard/vie ... de64858c89

UND - funzt bei mir prächtig!!!

Nochmals DANKE an alle.
:allright: