Das 1000ste Posting zum Thema PB_Network

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Das 1000ste Posting zum Thema PB_Network

Beitrag 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??
:? :? :? :?
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag 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
mfg
netfreak
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag 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
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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   
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag 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:
Antworten