[vb.net] TCP bestand verzenden lukt soms niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
Mijn vraag
Heb een stuk TCP bestand zend/ontvang code en dat werk soms wel soms niet 8)7, dit stukje maakt eerst een kopie van het bestand en gaat dan het kopie versturen. Waarom eerst een kopie: omdat het log bestanden zijn en die kunnen nogal eens snel gelockt worden.

Nu als ik de functie test met een ander bestand, dan word dat gewoon verstuurd zonder fout :/ ik zien ook dat op de "server" pc er een kopie van het bestand word aangemaakt en eenmaal door de code word deze ook weer verwijderd.

Met het ene bestand:
Afbeeldingslocatie: https://tweakers.net/i/2q3T7VPi2cGJcZAAlZbgg1VSiug=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/FG20os2qYl7Kh7Sj4FpZkk4a.png?f=user_large
en het andere bestand:
Afbeeldingslocatie: https://tweakers.net/i/UtebzNwYreaGlWBu8_PQ0y_Q_R4=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/7bCD2rl4HP69Wtkp891gWMIl.png?f=user_large

Relevante software en hardware die ik gebruik
Microsoft Visual Studio Community 2022 (64-bit) - Current Version 17.11.5
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 Try
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
     Dim client As New TcpClient
     '-wait on connection
     While Not client.Connected
         client.Connect(_UsedIp, _UsedPort)
         Thread.Sleep(100)
     End While
     StatusChange("SendFile: Connected to " & _UsedIp & ":" & _UsedPort)
     'writes a String and a Long with binarywriter (wrapping networkstream)
     Try
         My.Computer.FileSystem.CopyFile(File2Send, File2Send & "copy")
     Catch ex As Exception
         MessageBox.Show(ex.Message, "Sendfile error", MessageBoxButtons.OK, MessageBoxIcon.Error)
         Exit Try
     End Try
     Using bw As New BinaryWriter(client.GetStream)
         Dim info As New FileInfo(File2Send & "copy")
         'bw.Write(info.Name)
         bw.Write(info.Length)
         'using filestream to read file, writes this directly to networkstream
         Using fs As New FileStream(File2Send & "copy", FileMode.Open, FileAccess.Read)
             Dim buffer(_BufferSize) As Byte, length As Integer = -1
             Do Until length = 0
                 length = fs.Read(buffer, 0, buffer.Length)
                 client.GetStream.Write(buffer, 0, length)
             Loop
         End Using
     End Using
     client.Close()
     client.Dispose()
 Catch ex As Exception
     MessageBox.Show(ex.Message, "Sendfile error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
     StatusChange("SendFile::Error: " & ex.Message)
 End Try
 If File.Exists(File2Send & "copy") Then File.Delete(File2Send & "copy")


Bestanden zijn een paar kB en een paar MB.

Wat ik al gevonden of geprobeerd heb
Ik heb een extra try catch er in gezet (rond het kopie gedeelte) omdat ik dacht dat het daar mis liep maar dat is niet. Ik krijg nl een messagebox met uitroep teken en niet het error teken. En dan kreeg ik wrs ook een andere melding.

Ik bedacht me net dat ik die filelen waarde nog kon checken. deze komt goed door, word pas een probleem als de network stream word gelezen (lijn 3).
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
            Using fs As New FileStream(_SaveFilename, FileMode.Create, FileAccess.Write)
                Do Until readstotal = filelen
                    Reads = clientSocket.GetStream.Read(buffer, 0, buffer.Length)
                    fs.Write(buffer, 0, Reads)
                    readstotal += Reads
                    fs.Flush()
                Loop
                If fs.Length = 0 Then StatusChange("ReceiveFile: filesize = 0 bytes")
                StatusChange("ReceiveFile: done#" & _SaveFilename)
            End Using


Heb nu gemerkt, dat de messagebox eerst al op de "server" naar boven komt en niet op de client

[ Voor 11% gewijzigd door Damic op 02-11-2024 22:00 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag

Beste antwoord (via Damic op 08-11-2024 23:24)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je code lijkt me een beetje een allegaartje van bijelkaar geraapte (oude) code. Werkt dit?

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Imports System.Net
Imports System.Net.Sockets
Imports System.IO

Module Server
    Sub Main()
        ' Set up the server to listen on port 9000
        Dim listener As New TcpListener(IPAddress.Any, 9000)
        listener.Start()
        Console.WriteLine("Server is listening...")

        While True
            ' Accept incoming connection
            Dim client As TcpClient = listener.AcceptTcpClient()
            Console.WriteLine("Client connected.")

            ' Create a stream to receive data
            Dim networkStream As NetworkStream = client.GetStream()
            Using fileStream As New FileStream("received_file.txt", FileMode.Create)
                networkStream.CopyTo(fileStream)
                Console.WriteLine("File received and saved as 'received_file.txt'.")
            End Using

            ' Close client connection
            client.Close()
        End While
    End Sub
End Module

Module Client
    Sub Main()
        ' Specify the file path you want to send
        Dim filePath As String = "file_to_send.txt"
        
        ' Connect to the server
        Dim client As New TcpClient("127.0.0.1", 9000)
        Console.WriteLine("Connected to server.")

        ' Create a stream to send the file
        Dim networkStream As NetworkStream = client.GetStream()
        Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read)
            fileStream.CopyTo(networkStream)
            Console.WriteLine("File sent.")
        End Using

        ' Close the client connection
        client.Close()
    End Sub
End Module

Disclaimer: deze code komt uit ChatGPT, even geen zin om zelf ancient VB.Net kennis aan te boren :P Maar iets in deze richting zou moeten werken.

Maar heel eerlijk: ik zou niet eens zo laag gaan zitten; kun je niet gewoon een HTTP upload doen ofzo ipv zelf met sockets en buffers en weet-ik-wat gaan lopen soebatten?

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Imports System.Net
Imports System.IO

Module HttpServer
    Sub Main()
        ' Set up the HTTP listener
        Dim listener As New HttpListener()
        listener.Prefixes.Add("http://localhost:8080/")
        listener.Start()
        Console.WriteLine("HTTP server is listening on http://localhost:8080/")

        While True
            ' Wait for an incoming request
            Dim context As HttpListenerContext = listener.GetContext()
            Dim request As HttpListenerRequest = context.Request

            ' Handle POST requests only
            If request.HttpMethod = "POST" Then
                Console.WriteLine("Receiving file...")

                ' Save the uploaded file
                Using fileStream As New FileStream("received_file.txt", FileMode.Create)
                    request.InputStream.CopyTo(fileStream)
                    Console.WriteLine("File received and saved as 'received_file.txt'")
                End Using
            End If

            ' Send a response back to the client
            Dim response As HttpListenerResponse = context.Response
            response.StatusCode = 200
            Using writer As New StreamWriter(response.OutputStream)
                writer.Write("File received successfully")
            End Using
            response.Close()
        End While
    End Sub
End Module

Module HttpClientSender
    Async Sub Main()
        Dim filePath As String = "file_to_send.txt"

        Using client As New HttpClient()
            ' Read the file and create content for POST
            Dim content As New MultipartFormDataContent()
            Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read)
                Dim fileContent As New StreamContent(fileStream)
                content.Add(fileContent, "file", Path.GetFileName(filePath))

                ' Send the POST request
                Dim response As HttpResponseMessage = Await client.PostAsync("http://localhost:8080/", content)
                If response.IsSuccessStatusCode Then
                    Console.WriteLine("File sent successfully.")
                Else
                    Console.WriteLine("Failed to send file: " & response.StatusCode)
                End If
            End Using
        End Using
    End Sub
End Module


Again: ChatGPT code. Geen idee of 'ie 100% werkt, maar anders is er in de documentatie of op 't web vast wel een werkend stuk code te vinden dat in de buurt komt. En als je HTTP gebruikt kun je meteen profiteren van libraries als Refit of RestSharp o.i.d. die het aan de client zijde nog veel makkelijker maken en iets als Owin, Grpc, Web API o.i.d. aan de server zijde. Dan blijft er helemaal vrij weinig aan code over.

Vwb je probleem: Ik gok dat je ergens iets te vroeg disposed of dat je over de MTU heen gaat ofzo (nog een goede reden om niet zo laag te gaan zitten).

[ Voor 47% gewijzigd door RobIII op 02-11-2024 22:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je code lijkt me een beetje een allegaartje van bijelkaar geraapte (oude) code. Werkt dit?

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Imports System.Net
Imports System.Net.Sockets
Imports System.IO

Module Server
    Sub Main()
        ' Set up the server to listen on port 9000
        Dim listener As New TcpListener(IPAddress.Any, 9000)
        listener.Start()
        Console.WriteLine("Server is listening...")

        While True
            ' Accept incoming connection
            Dim client As TcpClient = listener.AcceptTcpClient()
            Console.WriteLine("Client connected.")

            ' Create a stream to receive data
            Dim networkStream As NetworkStream = client.GetStream()
            Using fileStream As New FileStream("received_file.txt", FileMode.Create)
                networkStream.CopyTo(fileStream)
                Console.WriteLine("File received and saved as 'received_file.txt'.")
            End Using

            ' Close client connection
            client.Close()
        End While
    End Sub
End Module

Module Client
    Sub Main()
        ' Specify the file path you want to send
        Dim filePath As String = "file_to_send.txt"
        
        ' Connect to the server
        Dim client As New TcpClient("127.0.0.1", 9000)
        Console.WriteLine("Connected to server.")

        ' Create a stream to send the file
        Dim networkStream As NetworkStream = client.GetStream()
        Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read)
            fileStream.CopyTo(networkStream)
            Console.WriteLine("File sent.")
        End Using

        ' Close the client connection
        client.Close()
    End Sub
End Module

Disclaimer: deze code komt uit ChatGPT, even geen zin om zelf ancient VB.Net kennis aan te boren :P Maar iets in deze richting zou moeten werken.

Maar heel eerlijk: ik zou niet eens zo laag gaan zitten; kun je niet gewoon een HTTP upload doen ofzo ipv zelf met sockets en buffers en weet-ik-wat gaan lopen soebatten?

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Imports System.Net
Imports System.IO

Module HttpServer
    Sub Main()
        ' Set up the HTTP listener
        Dim listener As New HttpListener()
        listener.Prefixes.Add("http://localhost:8080/")
        listener.Start()
        Console.WriteLine("HTTP server is listening on http://localhost:8080/")

        While True
            ' Wait for an incoming request
            Dim context As HttpListenerContext = listener.GetContext()
            Dim request As HttpListenerRequest = context.Request

            ' Handle POST requests only
            If request.HttpMethod = "POST" Then
                Console.WriteLine("Receiving file...")

                ' Save the uploaded file
                Using fileStream As New FileStream("received_file.txt", FileMode.Create)
                    request.InputStream.CopyTo(fileStream)
                    Console.WriteLine("File received and saved as 'received_file.txt'")
                End Using
            End If

            ' Send a response back to the client
            Dim response As HttpListenerResponse = context.Response
            response.StatusCode = 200
            Using writer As New StreamWriter(response.OutputStream)
                writer.Write("File received successfully")
            End Using
            response.Close()
        End While
    End Sub
End Module

Module HttpClientSender
    Async Sub Main()
        Dim filePath As String = "file_to_send.txt"

        Using client As New HttpClient()
            ' Read the file and create content for POST
            Dim content As New MultipartFormDataContent()
            Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read)
                Dim fileContent As New StreamContent(fileStream)
                content.Add(fileContent, "file", Path.GetFileName(filePath))

                ' Send the POST request
                Dim response As HttpResponseMessage = Await client.PostAsync("http://localhost:8080/", content)
                If response.IsSuccessStatusCode Then
                    Console.WriteLine("File sent successfully.")
                Else
                    Console.WriteLine("Failed to send file: " & response.StatusCode)
                End If
            End Using
        End Using
    End Sub
End Module


Again: ChatGPT code. Geen idee of 'ie 100% werkt, maar anders is er in de documentatie of op 't web vast wel een werkend stuk code te vinden dat in de buurt komt. En als je HTTP gebruikt kun je meteen profiteren van libraries als Refit of RestSharp o.i.d. die het aan de client zijde nog veel makkelijker maken en iets als Owin, Grpc, Web API o.i.d. aan de server zijde. Dan blijft er helemaal vrij weinig aan code over.

Vwb je probleem: Ik gok dat je ergens iets te vroeg disposed of dat je over de MTU heen gaat ofzo (nog een goede reden om niet zo laag te gaan zitten).

[ Voor 47% gewijzigd door RobIII op 02-11-2024 22:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
@RobIII ja werkt ongeveer, maar probleem blijft. Kleine bestanden = geen probleem grotere bestanden = probleem

Mmmmh web uploading, daar had ik nog niet aan gedacht. de sockets is eigenlijk gekomen omdat ik kleine requests doen, maar de antwoorden zijn toch altijd json zodus waarom ook niet :+

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
Damic schreef op zaterdag 2 november 2024 @ 22:48:
@RobIII ja werkt ongeveer, maar probleem blijft. Kleine bestanden = geen probleem grotere bestanden = probleem

Mmmmh web uploading, daar had ik nog niet aan gedacht. de sockets is eigenlijk gekomen omdat ik kleine requests doen, maar de antwoorden zijn toch altijd json zodus waarom ook niet :+
Dus die logbestanden zijn op dat moment in gebruik en kan naar geschreven worden terwijl jij die upload wil doen?

Als je vóór de upload eerst eenw probeert een kopie te maken naar een tijdelijk bestand en, als dat goed is gegaan, dan de upload doet.

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
@eheijnen dat doen ik al, zie lijn 12 van de eerst code snippet.
>> My.Computer.FileSystem.CopyFile(File2Send, File2Send & "copy")

[ Voor 33% gewijzigd door Damic op 03-11-2024 15:20 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
Damic schreef op zondag 3 november 2024 @ 15:20:
@eheijnen dat doen ik al, zie lijn 12 van de eerst code snippet.
>> My.Computer.FileSystem.CopyFile(File2Send, File2Send & "copy")
En komt ie goed door dat try block ?

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
jep op lijn 25 knalt ie eruit. Zelfs als ik de aanpassing van RobIII doen dan knalt ie eruit als het bestand te "groot" is. Had gisteren nacht nog wat aan't proberen geweest en zelfs bij 900kB knalde ie eruit :/

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
Damic schreef op zondag 3 november 2024 @ 15:45:
jep op lijn 25 knalt ie eruit. Zelfs als ik de aanpassing van RobIII doen dan knalt ie eruit als het bestand te "groot" is. Had gisteren nacht nog wat aan't proberen geweest en zelfs bij 900kB knalde ie eruit :/
en die kopie kun je dan wel handmatig uploaden?

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Nu online

Onbekend

...

Stop hij elke keer bij exact de zelfde hoeveelheid bytes?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • eheijnen
  • Registratie: Juli 2008
  • Niet online
dan gaat met copyfile iets niet goed....
ander mechanisme.....

Wie du mir, so ich dir.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
@Onbekend begint zelfs niet met uploaden.
@eheijnen copyfile is 100% een kopie

Heb juist wat aan't testen geweest en een bestand van 56kB gaat, nu zien vanaf welke grote ie afkapt :(

Edit: juist getest vanaf 80kB en fout meldingen tot 65kb eenmaal daaronder 64kB dan word het bestand verzonden :/

64kB buffer :/

Edit even in chatgpt gegooid:
Hi, in vb.net I've got a piece of code that transfer files over the network but if the file is bigger then 64kb I got a error that the stream is aborted.
Antwoord:
When transferring files over a network in VB.NET, encountering an error when dealing with files larger than 64KB may suggest that there’s a limitation or an issue with how the file transfer is implemented. Here are a few things you can check and try to resolve the issue:

1. **Buffer Size**: Ensure you are using a proper buffer size when reading from and writing to the network stream. Instead of trying to read the whole file at once, you can read it in chunks.

2. **Stream Handling**: Make sure that you're properly managing the streams. If the streams are being closed prematurely or if there are exceptions that are not being handled, it could result in the stream being aborted.

3. **Network Configuration**: Check if there are any limitations on the network configuration that could affect large file transfers. Firewalls or other network policies might impose restrictions.

4. **Code Example**: Here’s an example of how to read and write a file in chunks:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   Imports System.IO
   Imports System.Net.Sockets

   Public Sub TransferFile(filePath As String, host As String, port As Integer)
       Dim buffer(4095) As Byte ' 4KB buffer
       Using client As New TcpClient(host, port)
           Using stream As NetworkStream = client.GetStream()
               Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read)
                   Dim bytesRead As Integer
                   Do
                       bytesRead = fileStream.Read(buffer, 0, buffer.Length)
                       If bytesRead > 0 Then
                           stream.Write(buffer, 0, bytesRead)
                       End If
                   Loop While bytesRead > 0
               End Using
           End Using
       End Using
   End Sub


5. **Error Handling**: Implement proper error handling to catch exceptions and log them. This can help diagnose the issue.

6. **Testing with Smaller Files**: If the problem persists, try testing with files of various sizes to pinpoint if there’s a specific threshold causing the error.

7. **Timeouts**: Adjust timeout settings for the network stream, as a longer transfer time might lead to a timeout error if the default is too short.

By checking these aspects and using a buffered approach, you should be able to transfer larger files without encountering stream abort errors. Let me know if you need more help!
Heb nog wat verder gedaan met chatgpt (wel handige tool) en het zou wel eens aan windows kunnen liggen. 1 van de mogelijke opties was eens proberen met andere buffer groottes (bestand is 167kB groot):
4k:
Sent 4096 bytes; Total sent: 4096 bytes
Sent 4096 bytes; Total sent: 8192 bytes
Sent 4096 bytes; Total sent: 12288 bytes
Sent 4096 bytes; Total sent: 16384 bytes
Sent 4096 bytes; Total sent: 20480 bytes
Sent 4096 bytes; Total sent: 24576 bytes
Sent 4096 bytes; Total sent: 28672 bytes
Sent 4096 bytes; Total sent: 32768 bytes
Sent 4096 bytes; Total sent: 36864 bytes
Sent 4096 bytes; Total sent: 40960 bytes
Sent 4096 bytes; Total sent: 45056 bytes
Sent 4096 bytes; Total sent: 49152 bytes
Sent 4096 bytes; Total sent: 53248 bytes
Sent 4096 bytes; Total sent: 57344 bytes
Sent 4096 bytes; Total sent: 61440 bytes

8k:
Sent 8192 bytes; Total sent: 8192 bytes
Sent 8192 bytes; Total sent: 16384 bytes
Sent 8192 bytes; Total sent: 24576 bytes
Sent 8192 bytes; Total sent: 32768 bytes
Sent 8192 bytes; Total sent: 40960 bytes
Sent 8192 bytes; Total sent: 49152 bytes
Sent 8192 bytes; Total sent: 57344 bytes

16k:
Sent 16384 bytes; Total sent: 16384 bytes
Sent 16384 bytes; Total sent: 32768 bytes
Sent 16384 bytes; Total sent: 49152 bytes

32k:
Sent 32768 bytes; Total sent: 32768 bytes

64k:
Direct error

Morgen eens zien of ik er iets meer soep van kan maken :D

[ Voor 125% gewijzigd door Damic op 03-11-2024 21:18 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Voor het geval je het nog niet gevonden had: 64kb is een limitatie van TCP zelf, dat is de maximale grootte dat een packet mag zijn. Zie ook: https://www.baeldung.com/cs/tcp-max-packet-size

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
MatHack schreef op maandag 4 november 2024 @ 17:43:
Voor het geval je het nog niet gevonden had: 64kb is een limitatie van TCP zelf, dat is de maximale grootte dat een packet mag zijn. Zie ook: https://www.baeldung.com/cs/tcp-max-packet-size
Maar je moet toch over tcp grote bestanden kunnen versturen?

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Damic schreef op maandag 4 november 2024 @ 18:22:
[...]

Maar je moet toch over tcp grote bestanden kunnen versturen?
Ja, maar dat zijn dan meerdere packets. Ik kan in je code niet vinden hoe je de _BufferSize variabele/constante instelt, maar die zou m.i. in ieder geval niet grotere moeten zijn van 64kb.

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Damic schreef op zondag 3 november 2024 @ 16:48:
het zou wel eens aan windows kunnen liggen
Geloof me, dan hadden miljoenen mensen daar last van gehad. Voordat je dit soort dingen denkt of in zo'n hoek gaat zoeken moet je wel heel, héél zeker zijn van je zaak. Als je nou nog een vage library (of "package") had gebruikt ofzo zou je het in die hoek kunnen zoeken. Maar aan Windows of .Net zal het niet gauw liggen. Natuurlijk zitten daar ook bugs in, en je zult niet de eerste zijn die er een ontdekt, maar van zulke basale functionaliteit kun je vrij zeker zijn dat die gewoon werkt en kun je er van uit gaan dat je dus zelf ergens een (denk/programmeer)fout maakt

[ Voor 39% gewijzigd door RobIII op 04-11-2024 18:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
MatHack schreef op maandag 4 november 2024 @ 18:29:
[...]


Ja, maar dat zijn dan meerdere packets. Ik kan in je code niet vinden hoe je de _BufferSize variabele/constante instelt, maar die zou m.i. in ieder geval niet grotere moeten zijn van 64kb.
bovenaan dan geld dat zowel voor de send() als receive(). En in de vorige past zie je ook dat ik met verschillende buffer grootes heb getest.

@RobIII just kidding :)

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 28-09 21:34
Alhoewel ik geen kennis van vb.net heb vraag ik me af waarom je een BinaryWriter opent met de client stream, daar alleen info.length heen schrijft via bw.Write en daarna client.GetStream.Write gebruikt voor de rest van het bestand. Zou dat niet bw.Write moeten zijn? Anders voelt heel die BinaryWriter een beetje overbodig.

[ Voor 9% gewijzigd door Merethil op 04-11-2024 20:51 ]


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
@Merethil was om te testen hoe ik de bestand naam en bestand grootte over kon krijgen. Dat gebruik ik momenteel niet.

Ik ben verder geraakt, maar hoe dat is een andere zaak :F
Dus ik had als buffer grootte 2k (niet gepost) en verder geprobeerd, nu heb ik eens kleiner geprobeerd en het bestand werd met meer bytes over gezonden
...begin weg gelaten
Sent 512 bytes; Total sent: 105984 bytes
Sent 512 bytes; Total sent: 106496 bytes
Sent 512 bytes; Total sent: 107008 bytes
Sent 512 bytes; Total sent: 107520 bytes
Sent 512 bytes; Total sent: 108032 bytes
Sent 512 bytes; Total sent: 108544 bytes
Sent 512 bytes; Total sent: 109056 bytes
Sent 512 bytes; Total sent: 109568 bytes
Sent 512 bytes; Total sent: 110080 bytes
Sent 512 bytes; Total sent: 110592 bytes
Sent 512 bytes; Total sent: 111104 bytes
Sent 512 bytes; Total sent: 111616 bytes
SendFile::Error: at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at Dnetc_Ctrl_Service.FilesOverTCP.SendFile(String File2Send)
Ja dat is 111.616bytes :| nog niet de 167kB dat ik nodig heb maar ik kom er wel
Kleiner buffer dan maar op naar 256
..begin weggelaten
Sent 256 bytes; Total sent: 167680 bytes
Sent 256 bytes; Total sent: 167936 bytes
Sent 256 bytes; Total sent: 168192 bytes
Sent 256 bytes; Total sent: 168448 bytes
Sent 256 bytes; Total sent: 168704 bytes
Sent 256 bytes; Total sent: 168960 bytes
Sent 256 bytes; Total sent: 169216 bytes
Sent 256 bytes; Total sent: 169472 bytes
Sent 256 bytes; Total sent: 169728 bytes
Sent 256 bytes; Total sent: 169984 bytes
Sent 38 bytes; Total sent: 170022 bytes
:o dit gaat ook, is het een buffer limitatie?
laten we een groter log bestand proberen huppa 8MB (buffer van 256)
..begin weggelaten
Sent 256 bytes; Total sent: 655872 bytes
Sent 256 bytes; Total sent: 656128 bytes
Sent 256 bytes; Total sent: 656384 bytes
Sent 256 bytes; Total sent: 656640 bytes
Sent 256 bytes; Total sent: 656896 bytes
Sent 256 bytes; Total sent: 657152 bytes
Sent 256 bytes; Total sent: 657408 bytes
Sent 256 bytes; Total sent: 657664 bytes
Sent 256 bytes; Total sent: 657920 bytes
SendFile::Error: at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at Dnetc_Ctrl_Service.FilesOverTCP.SendFile(String File2Send)
Dat is 642,5kB mmmmmhhh TimeOut ? :/ :? dan zou die dat toch zeggen dat er een timeout is opgetreden?

Dan eens de buffer op 128 zetten.
hoppa 8MB erdoor :?
[...]Begin weg gelaten
Sent 128 bytes; Total sent: 8437248 bytes
Sent 128 bytes; Total sent: 8437376 bytes
Sent 128 bytes; Total sent: 8437504 bytes
Sent 128 bytes; Total sent: 8437632 bytes
Sent 128 bytes; Total sent: 8437760 bytes
Sent 88 bytes; Total sent: 8437848 bytes
Iemand verklaring hiervoor?

Even gezien hoever de 128B buffer gaat
SendFile::Error: at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at Dnetc_Ctrl_Service.FilesOverTCP.SendFile(String File2Send)
Sent 128 bytes; Total sent: 8607360 bytes
Ja dat is niet veel verder :+
SendFile::Error: at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at Dnetc_Ctrl_Service.FilesOverTCP.SendFile(String File2Send)
Buffer 64 bytes; Total sent: 571008 bytes
dat is maar 557,625kB :?

[ Voor 134% gewijzigd door Damic op 05-11-2024 19:46 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
Probeer het eens met Socket.SendFile

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
Wat, waarom ben ik dat niet tegen gekomen :/

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • +1 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
Afbeeldingslocatie: https://tweakers.net/i/HNfWRiAu5hQ8hn8B5EeoyjBI4Jg=/fit-in/4000x4000/filters:no_upscale():gifsicle():strip_exif()/f/image/nGhfugDvwxedcgUsP6Zo5ViO.gif?f=user_large

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
Mmmh even snel omgebouwd en is voor morgen verder te zoeken.
SendFile::SocketError: An attempt was made to access a socket in a way forbidden by its access permissions
SendFile::SocketErrorCode: 10013
Bestand word afgekapt op 32kB en het zit in het zend gedeelte volgens mij want het ontvang gedeelte gaat gewoon verder.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 Try
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
     Using client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
         '-wait on connection
         While Not client.Connected
             client.Connect(_UsedIp, _UsedPort)
             Thread.Sleep(100)
         End While
         StatusChange("SendFile: Connected to " & _UsedIp & ":" & _UsedPort)

         Try
             My.Computer.FileSystem.CopyFile(File2Send, File2Send & "copy")
         Catch ex As Exception
             StatusChange("SendFile::Error: couldn't create copy of file " & Environment.NewLine & ex.Message)
             Exit Try
         End Try
         client.SendBufferSize = _BufferSize
         client.SendFile(File2Send & "copy")
         client.Shutdown(SocketShutdown.Both)
     End Using
 Catch ex As SocketException
     Debug.WriteLine("SendFile::SocketError: " & ex.Message)
     Debug.WriteLine("SendFile::SocketErrorCode: " & ex.ErrorCode)
     StatusChange("SendFile::SocketError: " & ex.ToString)
 Catch ex As Exception
     Debug.WriteLine("SendFile::Error: " & ex.StackTrace)
     StatusChange("SendFile::Error: " & ex.ToString)
 End Try
 If File.Exists(File2Send & "copy") Then File.Delete(File2Send & "copy")


Lijn 18 word uitgevoerd en dan begint de do loop van het ontvangen (zie hieronder) van lijn 16 t.e.m. 21 dan bij 32kB springt ie naar lijn 21 (socket exception) en bij de ontvanger knalt ie naar 0 bytes received dus einde bestand. :?

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        Dim listener As TcpListener
        Try
            listener = CType(ar.AsyncState, TcpListener)
        Catch ex As Exception
            Debug.WriteLine("receivefile: " & ex.ToString)
            StatusChange("receivefile: err#couldn't create listener")
            Exit Sub
        End Try
        Using clientsocket As Socket = listener.EndAcceptSocket(ar)
            StatusChange("receivefile: connected to client: " & clientsocket.RemoteEndPoint.ToString)
            Try
                Dim buffer(_BufferSize - 1) As Byte, readstotal As Long = 0, BytesRead As Integer
                If File.Exists(_SaveFilename) Then File.Delete(_SaveFilename)
                clientsocket.ReceiveBufferSize = _BufferSize
                Using fs As New FileStream(_SaveFilename, FileMode.Create, FileAccess.Write)
                    Do
                        BytesRead = clientsocket.Receive(buffer, buffer.Length, 0)
                        If BytesRead = 0 Then Exit Do
                        fs.Write(buffer, 0, BytesRead)
                        readstotal += BytesRead
                    Loop
                End Using
                StatusChange("ReceiveFile: done#" & _SaveFilename)
            Catch ex As SocketException
                StatusChange("ReceiveFile: socketerr#" & ex.Message)
            Catch ex As Exception
                StatusChange("ReceiveFile: err#" & ex.Message)
            End Try
            clientsocket.Shutdown(SocketShutdown.Both)
        End Using

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
Iemand zit te fucken met je sockets. Zet je AV/firewall eens uit. Probeer eens een andere poort ergens buiten de voorgedefinieerde poorten. Dat soort dingen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
Ik gaan denk ik de raad opvolgen van Rob3 en de sockets laten voor wat ze zijn en een zeer simpele webserver gebruiken die hetzelfde doet als de sockets nu maar dan gemakkelijker :+

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Goed plan. Als er er geen tweeweg communicatie nodig is en je gewoon een bestand moet "dumpen" is dat veel simpeler.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
@sig69 ik moet alleen commando's kunnen sturen en antwoord krijgen :D

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
Zeer benieuwd waarom een webserver die HTTP bovenop TCP doet een makkelijkere manier zou zijn dan alleen TCP. Er is geen enkele reden om aan te nemen dat die functie van .NET niet zou kunnen werken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:17

Damic

Tijd voor Jasmijn thee

Topicstarter
farlane schreef op zaterdag 9 november 2024 @ 10:28:
Zeer benieuwd waarom een webserver die HTTP bovenop TCP doet een makkelijkere manier zou zijn dan alleen TCP. Er is geen enkele reden om aan te nemen dat die functie van .NET niet zou kunnen werken.
Omdat het gewoon werkt en je hebt niet veel zelf nodig :Y)

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag

Pagina: 1