Tcp senden und empfangen von Dateien

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Tcp senden und empfangen von Dateien

    Guten Abend,

    ich versende von einem Tablet (Client) zu meinem PC (Server) eine Datenbank diese soll mit einer weiteren Datenbank synchronisiert werden. Im Anschluss soll die Synchronisierte Datenbank wieder zurück an den Client versendet werden.
    Wenn ich nun die Datenabnk vom Client zum Server sende muss ich den Client beenden, tue ich das nicht, bleibt der Server nach einer While -Schleife hängen. Eine Fehlermeldung bekomme ich nicht.

    Die Problem -Methode
    Spoiler anzeigen

    C#-Quellcode

    1. public void ReceiveData()
    2. {
    3. byte[] bRecData = new byte[BufferSize];
    4. int iRecBytes=0;
    5. int iTotalRecBytes = 0;
    6. using (FileStream fs = new FileStream(DbSavePath.FullName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
    7. while ((iRecBytes = stream.Read(bRecData, 0, bRecData.Length)) > 0) {
    8. fs.Write(bRecData, 0, iRecBytes);
    9. iTotalRecBytes += iRecBytes;
    10. // Event feuern
    11. ReceivedBytes(iRecBytes);
    12. }
    13. // Event feuern
    14. ReceiveCompleted(iTotalRecBytes);
    15. }


    Die While -Schleife läuft durch und danach passiert nichts mehr. Erst wenn ich den Client schließe wird mir der Event ReceiveCompleted gefeuert und die Datenbank Synchronisation wird gestartet. Ich habe leider keine Ahnung woran das liegt geschweige denn wie das lösen könnte.
    Ich konnte das Problem nun lösen. Ich bin zum einen auf Sockets umgestiegen. Ebenso habe ich die Schleife etwas umgestellt und das ganze dann um eine Funktion erweitert. Ich versende nach dem Senden von Daten ein Byte -Array mit der Länge 0, dadurch wird die Schleife verlassen. Die Datenbank kann Synchronisiert werden und an den Socket zurück gesendet werden.

    Receive -Schleife

    C#-Quellcode

    1. Byte[] receiveBytes = new Byte[BufferSize];
    2. int iReceivedData = 0;
    3. using (FileStream fs = new FileStream(fiTestFiel.FullName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
    4. do {
    5. iReceivedData = client.Receive(receiveBytes, 0, receiveBytes.Length, SocketFlags.None);
    6. fs.Write(receiveBytes, 0, iReceivedData);
    7. // Event Feuern
    8. ReceiveData(iReceivedData, client);
    9. } while (client.Available > 0);
    10. SendData(client, fiTestFiel);



    Send Methode

    C#-Quellcode

    1. private void SendData(Socket socket, FileInfo fi)
    2. {
    3. using (FileStream fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
    4. int iPackets = (int)Math.Ceiling(((double)fs.Length / (double)BufferSize));
    5. int iTotalLength = (int)fs.Length, iCurrentPacketLength;
    6. Byte[] buffer = null;
    7. for (int i = 0; i < iPackets; i++) {
    8. if (iTotalLength > BufferSize) {
    9. iCurrentPacketLength = BufferSize;
    10. iTotalLength = iTotalLength - iCurrentPacketLength;
    11. }
    12. else
    13. iCurrentPacketLength = iTotalLength;
    14. buffer = new Byte[iCurrentPacketLength];
    15. fs.Read(buffer, 0, buffer.Length);
    16. socket.Send(buffer);
    17. // Event feuern
    18. SendData(buffer, socket);
    19. }
    20. }
    21. SendDeauthPacket(socket);
    22. }



    SendDeauthPacket

    C#-Quellcode

    1. public bool SendDeauthPacket(Socket socket)
    2. {
    3. Byte[] deauthByte = new Byte[0];
    4. socket.Send(deauthByte);
    5. // Event Feuern
    6. SendingDeauthPacket(deauthByte);
    7. return true;
    8. }

    Ich kann die Skepsis verstehen, aber das ganze läuft bis jetzt sehr stabil. Teste es bereits seit gestern ohne Ausfall. Der Puffer muss zwingend in der Schleife instanziert werden da die Paket die versendet werden nicht immer die gleiche Größe haben. Sehr empfehlen kann ich hier TCP/IP Socket-Programmierung in C#
    na, wenn die Anzahl zu sendender Bytes variiert, dann nimm doch eine Überladung, der man diese Anzahl mit angeben kann - gugge im ObjectBrowser
    Public Function Send(buffer() As Byte, size As Integer, socketFlags As System.Net.Sockets.SocketFlags) As Integer
    Member of System.Net.Sockets.Socket
    Summary:
    Sends the specified number of bytes of data to a connected System.Net.Sockets.Socket, using the specified System.Net.Sockets.SocketFlags.

    Parameters:
    buffer: An array of type System.Byte that contains the data to be sent.
    size: The number of bytes to send.
    socketFlags: A bitwise combination of the System.Net.Sockets.SocketFlags values.

    Return Values:
    The number of bytes sent to the System.Net.Sockets.Socket.