Seite 1 von 2

Bug beim versenden großer Daten? [PB 4.1]

Verfasst: 06.08.2007 10:12
von Joel
Hallo,

Ich habe ein Bug entdeckt das in der PB.Version 4.10 Beta 2 und unter Windows XP und 98 auftritt.

Wenn ich eine Datei mit SendNetworkFile() Sende und diese mit ReceiveNetworkFile() empfange und diese größer als ~ 40 Mb ist dann wird das senden nach ~ 20 Mb einfach abgebrochen (Der Befehl arbeitet zwar noch aber die Dateigröße verändert sich nichtmehr)
Dieses Bug ist mir bei allen Dateien die Größer sind als ~ 40 Mb aufgefallen (ich habe es bei zb. MPG, AVI, WMV, TXT und doc probiert)

Hier unten ist ein Beispiel Code für PB 4.10 Beta 2:


Server:

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf
Port = 6832
If CreateNetworkServer(0, Port)
  Repeat 
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID = EventClient()
      Select SEvent
        
        Case 3
          ReceiveNetworkFile(ClientID, "C:\TEST.mpg") ; Der Video wird hier empfangen, bricht aber immer zwischen 8 und 20 Mb einfach ab zu senden. Der Befehl ReceiveNetworkFile ist aber weiterhin am Arbeiten.
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  
  CloseNetworkServer(0)
EndIf

  
End   

Client:

Code: Alles auswählen

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

Port = 6832

ConnectionID = OpenNetworkConnection("meinedns.dyndns.org", Port)
If ConnectionID
  
  SendNetworkFile(ConnectionID, "K:\Test.mpg") ; Größe (300 MB)
    
  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: 10.08.2007 23:33
von PBZecke
Ist schon immer so gewesen in PB, ist vielleicht auch n windows-problem.
Im englischem Forum gibt's n Thread darüber, is glaub ich abhängig vom
Arbeitsspeicher wie groß die Dateien sein können. Bei mir brachs bei 80
MB ab. Solche Dateien solltest eh splitten, falls Verbindungsabbrüche
auftreten, dann brauchste nich noch einmal von vorne anfangen.

Verfasst: 15.05.2008 20:59
von Joel
Ich fände es gut, wenn der Fehler mal behoben wird,

In anderen Programmiersprachen funktioniert das auch, liegt glaube ich dann nicht an Windows.

Vielleicht kann der Fehler ja mal in PB 4.20 gehoben werden, dann ist mein Programm 80% kleiner als sonst. :wink:

Verfasst: 16.05.2008 20:00
von THEEX
Also ein Windowsporblem kann das nicht sein, sonst würde man ja allgemein keine Dateien über 20 MB ziehen können...
[Edit]
Ich würde "SendNetworkFile()" nicht unbedingt zum versenden von Daten nutzen, in der Zeit können keine andere Daten gesendet bzw. empfangen werden. Für einen Server wäre das schlecht. Bei einer Peer to Peer - Verbindung wäre das vielleicht noch ok.

Verfasst: 17.05.2008 09:46
von Joel
Hmmmm, weiß einer woran das sonst liegen kann???

Habe auch mal im Englischen Forum geschrieben, scheinbar in denen nochnie aufgefallen das man nur kleine Daten versenden kann :mrgreen:

Es müsste einen neuen Befehl geben der die Daten Teilt und dann erst sendet, oder gerade einen der das Bug nichtmehr hat

Verfasst: 17.05.2008 11:27
von THEEX
Dafür brauchst Du keinen Befehl, das kannst selbst machen. Ist natürlich mit etwas Aufwand verbunden, aber gehen tut das auf jeden Fall.
Ich hab im moment nur leider nicht den Nerv, dafür ein Beispiel zu machen, aber vielleicht gibts sogar Beispiele dafür. Wobei meines Wissens nach, hier noch nicht sonderlich viel mit Netzwerk-Routinen veröffentlicht wurde, es müßte aber ein paar Leut geben, die sich damit recht gut auskennen.

Verfasst: 17.05.2008 13:14
von PureProgger
Hi,

wenn SendNetworkFile nicht funktioniert bei größeren Datenmengen sollte man es vielleicht mal mit SendNetworkData probieren!

gruß Michael

Verfasst: 18.05.2008 22:25
von PMV

Code: Alles auswählen

Procedure MySendNetworkFile(ConID.l, File$, Size.l = 1024)
  Protected Length.l
  Protected File.l = ReadFile(#PB_Any, File$)
  Protected *Buffer = AllocateMemory(Size)

  If File And *Buffer And ConID
    While Not Eof(File)
      Length = ReadData(File, *Buffer, Size)
      SendNetworkData(ConID, *Buffer, Length)
    Wend
  EndIf

  If File : CloseFile(File) : EndIf
  If *Buffer : FreeMemory(*Buffer) : EndIf
EndProcedure
Hier mal eine Quick&Dirty Prozedur. Ungetestet!
Fals etwas unklar, fragen ... :wink:

Von SendNetworkFile() halte ich persönlich nicht viel, da man keine
kontrolle über den wirklichen Datenfluss hat und sie das gesamte
Programm blockiert. Das problem mit den großen Dateien wurde im
Forum glaub auch schon mal erwähnt.

Edit: Ups, danke edel, ganz vergessen :oops: ... hab die Struktur
mal geändert, zum Verständnis sollte es so reichen.

MFG PMV

Verfasst: 18.05.2008 22:46
von edel
Hier mal eine Quick&Dirty Prozedur. Ungetestet!

Der untere Teil wird nie ausgefuehrt wenn die Datei
gesendet werden konnte.


edit:
Stand da nicht grad was anderes ? naja Wurst, es fehlt trotzdem ein
Freememory.

Verfasst: 18.05.2008 23:23
von THEEX
Ohne mir jetzt die Procedure genauer anzuschauen, ich halte es nicht gut, ungetestete Lösungen zu für irgendwelche Probleme zu posten. Vorallem, wenn es sich bei der Anfrage offensichtlich im jemanden handelt, dem es noch einiges an Erfahrung fehlt.