Laden...

Wie Dateien über Sockets senden

Erstellt von ExclusivAtom vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.917 Views
E
ExclusivAtom Themenstarter:in
48 Beiträge seit 2015
vor 7 Jahren
Wie Dateien über Sockets senden

Guten abend,
ich habe eine funktionierende Server/Client Anwendung.

Mit dieser Methode sende ich strings an den Client:


        private void SendData(Socket socket, string text)
        {
            byte[] data = Encoding.ASCII.GetBytes(text);
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnSendCallback), socket);
        }

        private void OnSendCallback(IAsyncResult ar)
        {
            Socket socket = (Socket)ar.AsyncState;
            socket.EndSend(ar);
        }

Annehmen der Bytes mache ich mit der Methode:


private void OnReceiveCallback(IAsyncResult ar)
        {
            int received = 0;
            string text = string.Empty;
            Socket socket = (Socket)ar.AsyncState;
            try
            {
                received = socket.EndReceive(ar);
                byte[] data = new byte[received];
                Array.Copy(buffer, data, received);
                text = Encoding.ASCII.GetString(data);
                clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceiveCallback), clientSocket);
            }
            catch (Exception ex)
            {

            }
        }

Aber wenn ich jetzt zum Beispiel ein Foto senden möchte, benutze ich die Socket.BeginSendFile() Methode. Das senden funktioniert ohne Probleme. Lande dann beim Client, in der "OnReceiveCallback" Methode. Aber wie kann ich das am besten Lösen, wann ein string, wann eine Bilddatei, exe Datei, txt Datei kommt?

Habt ihr irgendwelche Vorschläge oder Verbesserungsvorschläge?
LG

16.842 Beiträge seit 2008
vor 7 Jahren

Da musst Du Dir ein eigenes Protokoll ausdenken oder ein vorhandenes, passendes verwenden.
Dadurch erhöht sich der Overhead der Bytes, aber dadurch wird eine Art Vertrag des Datenaustauschs erst möglich.

Normalerweise würde man daher auch weniger auf die Socket-Klasse setzen, sondern auf bestehende Technologien wie zB. WCF oder WebSockets setzen.
Protokolle auf Socket-Basis haben sehr sehr viele Fallstricke, wie Fehlermeldungen etc.

Auch die Verschlüsselung und den Handshake müsstest Du selbst implementieren (wobei Du Dich hier auf ein paar Sachen wie den SslStream orientierten kannst).

E
ExclusivAtom Themenstarter:in
48 Beiträge seit 2015
vor 7 Jahren

Danke für deine Antwort.
Ich überlege mal was ich mache.