Netzwerk Problem oder Bug {Große Daten Versenden}

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3040
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:

Beitrag von HeX0R »

Delay hält dein Programm zwar an, Windows selbst kann aber gemütlich weiter senden.
Sogesehen funktioniert es auch.

Aber man muss bedenken, dass dieser Codeschnippsel völlig unbrauchbar ist.
Welches Programm sendet ein File und beendet sich sofort danach ?
Genau das ist das hüpfende Komma.
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

So, jetzt klappt es ja fast. Nochmal zurück zu den Code Vorher (siehe Unten), ´wenn ich das .png Bild Versende wird 1 Zurückgegeben aber das Bild wurde nur 32 Byte groß erstellt und konnte nicht geladen werden.
Wenn ich das Bild aber mit dem PB Network Beispiel Versende klappt das also ist irgentein Fehler in dem Code (Es ist schon komisch, manchmal klappt mein Programm und Manchmal nicht)Kann den Code mal einer Testen?
Ihr müsst nur ein Bild in C:\Windows\gsm.bmp speichern.

Server:

Code: Alles auswählen

Procedure Tool() 
 ClientID = EventClient() 
If  OpenWindow(0, 50, 100, 300, 500, "Server" , #PB_Window_SystemMenu , 0) 
If CreateGadgetList(WindowID(0)) 
ButtonGadget(1, 10, 15, 250, 30, "Monitor Abbild") 
Repeat 
    EventID = WaitWindowEvent() 
    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 
    If EventID = #PB_Event_Gadget 
      If EventGadget() = 1 
      ClientID = EventClient() 
      UsePNGImageDecoder() 
      UsePNGImageEncoder() 
      SendNetworkString(ClientID, "Desktops") 
      Repeat 
      em = ReceiveNetworkFile(ClientID, "C:\empf.png") 
      Until em <> 0 
      m = LoadImage(#PB_Any, "C:\empf.png") 
      SaveImage(m, "C:\save.bmp" , #PB_ImagePlugin_BMP) 
      LoadImage(3, "C:\save.bmp" , 0) 
      If  OpenWindow(0, 1, 1, 1050, 730, "Arbeit" , #PB_Window_BorderLess |  #PB_Window_Maximize, 0) 
      StickyWindow(0, 0) 
      If CreateGadgetList(WindowID(0)) 
      ImageGadget(200, 1, 1, 1, 1, ImageID(3) , 0) 
      Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
      EndIf 
      EndIf 
      EndIf 
EndIf 
Until lol = 1 
EndIf 
   EndIf 
EndProcedure 



Procedure Net(no.l) 
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6880 
Buffer = AllocateMemory(1000) 

If CreateNetworkServer(0, Port) 

  
  
  Repeat 
     SEvent = NetworkServerEvent() 
  
    If SEvent 
    
      ClientID = EventClient() 
      
      Select SEvent 
      
        Case 1 
        If Tool() 
        EndIf  
        
        Case 3 
          
      
        
              
       Case 4 
       MessageRequester("Error", "Case 4 ist aktiv", 0) 
      
        
    EndSelect 
    EndIf 
    
       Until Quit = 1 
        
         EndIf 
         EndProcedure 
          
;----------------------------------------------------------------------------------------- 
          
          
         prThread = CreateThread(@Net(), 456) 
Repeat 
If WaitThread(prThread) 
abc = 5 
EndIf 
Until abc = 5  

Client:

Code: Alles auswählen

Procedure Main(Dummy.l) 
;-Vorbereiten der Netzwerk-Einstellungen 

InitNetwork() 

Port = 6880 

;-Schleife zur Verbindungs-Herstellung 
  Repeat 
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port) 
If ConnectionID 

EndIf 
Delay(100) 
Until ConnectionID <> 0 


Repeat 

    
    ServerID = NetworkClientEvent(ConnectionID) 
    Select ServerID 
  
   Case 2 
   Repeat 
   Datenpuffer.s = Space(8) 
   ReceiveNetworkData(ConnectionID, @Datenpuffer, 66) 
   If Datenpuffer = "Desktops" 
   RunProgram("C:\Windows\System\loli.exe") 
 Delay(1100) 
 UsePNGImageEncoder() 
  
image = LoadImage(#PB_Any,"C:\Windows\gsm.bmp") 
If image 
EndIf 
If SaveImage(image, "C:\mssm.png",#PB_ImagePlugin_PNG) 
EndIf 
Delay(1000) 
Repeat 
   sm = SendNetworkFile(ConnectionID, "C:\mssm.png") 
   Until sm <> 0 
   Delay(6000) 
 EndIf 
   ForEver 
   
Case 4 
MessageRequester("Error", "Case 4", 0) 
  
  End 
  EndSelect 
  
 Until Quit = 1 
  



EndProcedure 

;---------------------------------------------------------------------------------------- 


amThread = CreateThread(@Main(), 123) 
Repeat 
If WaitThread(amThread) 
thread = 2 
EndIf 
Until thread = 2
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Joel hat geschrieben:Ich habe den Fehler entdeckt.

Ganz einfach, Der ReceiveNetworkFile() Befehl wartet bis die Datei gesendet wird. Aber bei SendNetworkFile() ist das anders, da wird so eine Art Verknüpfung aufgebaut und der Code wird ausgeführt. Wenn dannach dann ein "End" steht ist das Programm zu Ende und der Versand ist unterbrochen.
FALSCH! Den Fehler hat schon jemand anders entdeckt: http://www.purebasic.fr/german/viewtopi ... file+AND51
Du hast sogar selbst schon dort geantwortet.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Stimmt!!! :oops: :oops:

Übrigens der Code Funktioniert bei mir auch nicht.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nach wie vor finde ich, dass SendNetworkFile() auch warten sollte, bis die Datei versendet wurde.
Noch besser: Man sollte ähnlich wie bei den Packer-Befehlen einen benutzerdefinierten Callback angeben können.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ach ja und der Code sieht immer noch furchtbar aus :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Aber sag mal,ist das denn nicht grundlegend egal? Es gibt ja eh nur die Möglichkeit durch eine Bestätigung vom Empfänger sicher zu gehen, daß die Daten, in dem Fall die Datei, auch empfangen wurden. Und ob das nun die Sendnetworkroutine oder man selber macht ist doch egal. Klar, wenn SendNetworkFile das übernimmt, würde man sich arbeit sparen, wäre also schön, aber läuft ja genau so als ob man das selber machen würde.
Und das auch der Sender warten muß bis die Daten angekommen sind, ist doch eher lästig. Wozu ein Programm stoppen, obwohl es nicht sein muß. Es kann ja sein, daß man so stundenlang warte muß ohne zu wissen, ob die Datei noch gesendet wird oder was hängen geblieben ist.
Wie ich ja leider festellen mußte bedeutet unter Windows die Bestätigung eines erfolgreichen sendens von Daten nicht, daß diese auch empfangen wurden.
Also da kann man dann diese Überprüfung lieber selber übernehmen und den Prozess so weiter laufen lassen. Ich habe daher ganz auf SendNetworkFile() verzichten müssen.
Die Hilfedatei, die ansonsten ja nicht schlecht ist, sollte doch mal etwas verbessert werden. Da kann man noch einiges machen.
Das ständige testen, was die Funktion nun wirklich macht bzw. das fragen zu hier ist schon extrem zeitaufwendig und hält auf.
1. Win10
PB6.1
Benutzeravatar
HeX0R
Beiträge: 3040
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:

Beitrag von HeX0R »

SendNetworkFile() ist ohnehin nur für Gelegenheits Progger implementiert.
Wer was ernsthaftes machen will, würde es sicherlich nie verwenden und sich lieber was eigenes z'ammbasteln.
Auch mit dem erwähnten Callback, usw.

Wenn PB einem zuviel Arbeit abnimmt, werden wir eh nur alle faul, fett und gefrässig :mrgreen: .
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

PB ist auch für Anfänger optimiert, d. h. ein Callback wäre eine gute Idee.
Die Hilfe erwähnt, dass die Dateien "mittels sehr spezieller und sehr sicherer Methoden" versendet werden, also warum soll auch ein "Experte/Fortgeschrittener" nicht davon Gebrauch machen können?

Warum soll der "Fehler" also nicht behoben werden, wenn man nun davon Gebrauch machen will?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Ja, das mit dem Callback ist ne gute Idee. Aber das Problem ist ja: Wenn ich die Datei in dem Code oben Versende, wird 1 von Client und Serverseite zurückgegeben aber die Datei wurde nicht richtig gespeicher bzw. nicht richtig Verschickt (Und ist nur etwa 32 Byte groß), das hat nichts mit dem END nach dem Senden zutun.

Desswegen will ich erstmal wissen woran es liegt dass ich die Datei nicht richtig empfange bevor ich ein Callback produziere.

Das komische ist das die Datei im PB Beispiel "richtig" empfangen wird also liegts warscheinlich an meinem Code. Vielleicht Hilft es ja wenn ihr mal einen eigenen Code Veröffentlichen würdet, wie ihr ein Monitor Bild Verschicken würdet. (Und hoffentlich einen wo es klappt)
Antworten