Hallo zusammen,
bin ganz neu hier im Forum und sonst auch eher C-Milieu unterwegs.
Ich hatte den Plan, mir in VB .NET eine P2P Anwendung zu schreiben, mit der ich problemlos & unkompliziert Dateien versenden bzw. empfangen kann.
Das hat nach meiner Vorstellung auch funktioniert - bis auf das (bekannte) Problem, dass der Puffer beim Networkstream oft nicht ganz gefüllt wird, jedoch beim Empfänger immer ganz in die Datei geschrieben wird. Deshalb habe ich auf Infinity's Code zurückgegriffen, der dieses Problem mit den Methoden Receive und Send des Sockets gelöst hat.
Bis hierhin habe ich den Code nun in meinem Projekt implementiert (Infinity hat sich als netter Email-Kontakt herausgestellt ). Das Problem ist nur, dass bei meinem Code der letzte Puffer mit der Fehlermeldung "Offset und Länge für das Array liegen außerhalb des gültigen Bereichs, oder die Anzahl ist größer als die Anzahl der Elemente vom Index bis zum Ende der Quellauflistung." nicht gelesen wird und aufgrund dessen die geschrieben Dateien nicht vollständig sind. Dazu muss ich anmerken, dass dieser Fehler erst bei einer Dateigröße ab ca. 2.1 MB auftritt, weshalb ich vermutete, dass es etwas mit dem Wertebereich einer Integer zu tun haben könnte (beim Debuggen taucht die Zahl -2147024809 bei _HResult auf)...
Hier mal der Code zum Senden:
Spoiler anzeigen
Und der Code zum Empfangen:
Spoiler anzeigen
Ich hoffe, dass jemand mal über die Codes drüber sehen und mir helfen kann
Gruß
bin ganz neu hier im Forum und sonst auch eher C-Milieu unterwegs.
Ich hatte den Plan, mir in VB .NET eine P2P Anwendung zu schreiben, mit der ich problemlos & unkompliziert Dateien versenden bzw. empfangen kann.
Das hat nach meiner Vorstellung auch funktioniert - bis auf das (bekannte) Problem, dass der Puffer beim Networkstream oft nicht ganz gefüllt wird, jedoch beim Empfänger immer ganz in die Datei geschrieben wird. Deshalb habe ich auf Infinity's Code zurückgegriffen, der dieses Problem mit den Methoden Receive und Send des Sockets gelöst hat.
Bis hierhin habe ich den Code nun in meinem Projekt implementiert (Infinity hat sich als netter Email-Kontakt herausgestellt ). Das Problem ist nur, dass bei meinem Code der letzte Puffer mit der Fehlermeldung "Offset und Länge für das Array liegen außerhalb des gültigen Bereichs, oder die Anzahl ist größer als die Anzahl der Elemente vom Index bis zum Ende der Quellauflistung." nicht gelesen wird und aufgrund dessen die geschrieben Dateien nicht vollständig sind. Dazu muss ich anmerken, dass dieser Fehler erst bei einer Dateigröße ab ca. 2.1 MB auftritt, weshalb ich vermutete, dass es etwas mit dem Wertebereich einer Integer zu tun haben könnte (beim Debuggen taucht die Zahl -2147024809 bei _HResult auf)...
Hier mal der Code zum Senden:
VB.NET-Quellcode
- PrivateSub sendSub()
- Dim client AsNewTcpClient
- Try
- client.Connect(TextBox1.Text, TextBox2.Text)
- Catch ex AsException
- MsgBox("Verbindung mit dem Zielcomputer konnte nicht hergestellt werden.", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
- Me.Invoke(Sub() Button1.Enabled = True)
- Me.Invoke(Sub() RadioButton2.Enabled = True)
- End Try
- Dim fstream AsStream = NewFileStream(sendPath, FileMode.Open, FileAccess.Read)
- Dim nstream AsNetworkStream = client.GetStream
- Dim streamw AsStreamWriter
- Dim bytesSent AsLong
- Dim buffer(client.SendBufferSize - 1) AsByte
- Dim fileSize AsLong = fstream.Length
- Try
- Me.Invoke(Sub() Label9.Visible = True)
- Me.Invoke(Sub() Label10.Visible = True)
- streamw = NewStreamWriter(nstream)
- streamw.WriteLine(fileSize)
- streamw.Flush()
- Me.Invoke(Sub() Label12.Text = System.Math.Round((fileSize / 1000000), 2) & " MB")
- Me.Invoke(Sub() ProgressBar1.Minimum = 0)
- Me.Invoke(Sub() ProgressBar1.Maximum = fileSize)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- While bytesSent + client.SendBufferSize < fstream.Length
- fstream.Read(buffer, 0, buffer.Count)
- bytesSent += client.Client.Send(buffer, SocketFlags.None)
- Me.Invoke(Sub() Label5.Text = System.Math.Round((bytesSent / 1000000), 2))
- Me.Invoke(Sub() ProgressBar1.Value = bytesSent)
- End While
- fstream.Read(buffer, 0, CInt(fstream.Length - bytesSent)) '<----- An dieser Stelle tritt der Fehler auf
- client.Client.Send(buffer, CInt(fileSize - bytesSent), SocketFlags.None)
- Me.Invoke(Sub() Label5.Text = System.Math.Round((fileSize / 1000000), 2))
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Maximum)
- fstream.Close()
- nstream.Close()
- client.Close()
- Catch ex AsException
- MsgBox("Datenübertragung fehlgeschlagen.", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
- Me.Invoke(Sub() Button1.Enabled = True)
- Me.Invoke(Sub() RadioButton2.Enabled = True)
- Me.Invoke(Sub() Label9.Visible = False)
- Me.Invoke(Sub() Label10.Visible = False)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- End Try
- MsgBox("Datenübertragung abgeschlossen.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Information")
- Me.Invoke(Sub() Button1.Enabled = True)
- Me.Invoke(Sub() RadioButton2.Enabled = True)
- Me.Invoke(Sub() Label9.Visible = False)
- Me.Invoke(Sub() Label10.Visible = False)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- End Sub
Und der Code zum Empfangen:
VB.NET-Quellcode
- PrivateSub getSub()
- Dim listener AsNewTcpListener(IPAddress.Any, TextBox2.Text)
- listener.Start()
- Dim fstream AsNewFileStream(getPath, FileMode.Create, FileAccess.Write)
- Dim streamr AsStreamReader
- Dim client AsTcpClient = listener.AcceptTcpClient
- Dim nstream AsNetworkStream = client.GetStream
- Dim bytesWritten AsLong
- Dim buffer(client.ReceiveBufferSize - 1) AsByte
- Dim received AsInteger
- Dim fileSize AsLong
- Try
- streamr = NewStreamReader(nstream)
- fileSize = streamr.ReadLine
- Me.Invoke(Sub() Label12.Text = System.Math.Round((fileSize / 1000000), 2) & " MB")
- Me.Invoke(Sub() ProgressBar1.Minimum = 0)
- Me.Invoke(Sub() ProgressBar1.Maximum = fileSize)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- While bytesWritten + client.ReceiveBufferSize < fileSize
- received = client.Client.Receive(buffer, SocketFlags.None)
- fstream.Write(buffer, 0, received)
- bytesWritten += received
- Me.Invoke(Sub() Label5.Text = System.Math.Round((bytesWritten / 1000000), 2))
- Me.Invoke(Sub() ProgressBar1.Value = bytesWritten)
- EndWhile
- received = client.Client.Receive(buffer, CInt(fileSize - bytesWritten), SocketFlags.None)
- fstream.Write(buffer, 0, received)
- Me.Invoke(Sub() Label5.Text = System.Math.Round((fileSize / 1000000), 2))
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Maximum)
- fstream.Close()
- client.Close()
- nstream.Close()
- listener.Stop()
- Catch ex AsException
- MsgBox("Dateiübertragung fehlgeschlagen.", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
- Me.Invoke(Sub() Button2.Enabled = True)
- Me.Invoke(Sub() RadioButton1.Enabled = True)
- Me.Invoke(Sub() Label7.Visible = False)
- Me.Invoke(Sub() Label9.Visible = False)
- Me.Invoke(Sub() Label8.Visible = False)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- EndTry
- MsgBox("Datenübertragung abgeschlossen.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Information")
- Me.Invoke(Sub() Button2.Enabled = True)
- Me.Invoke(Sub() RadioButton1.Enabled = True)
- Me.Invoke(Sub() Label7.Visible = False)
- Me.Invoke(Sub() Label9.Visible = False)
- Me.Invoke(Sub() Label8.Visible = False)
- Me.Invoke(Sub() ProgressBar1.Value = ProgressBar1.Minimum)
- EndSub
Ich hoffe, dass jemand mal über die Codes drüber sehen und mir helfen kann
Gruß