Entwickler-Ecke

Netzwerk - NetworkStream.Read schägt beim zweiten Aufruf fehl


littleman - Di 05.05.09 15:58
Titel: NetworkStream.Read schägt beim zweiten Aufruf fehl
Hallo,

vorab: ich nutze VS 2005.

Ich habe mir einen Server in C# geschrieben (Beispiel aus I-Net). Dieser erstellt per anfragenden Client einen Thread und soll erstmal als Echo Server dienen. Folgend, der Code (als Consolen-Anwendung):


C#-Quelltext
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:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;

namespace myServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Server srv = new Server();
        }
    }

    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }

        private void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {
                //blocks until a client has connected to the server
                TcpClient client = this.tcpListener.AcceptTcpClient();

                Console.WriteLine("Hello Server");

                //create a thread to handle communication
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 04096);
                }
                catch(Exception ex)
                {
                    //a socket error has occured
                    Console.WriteLine(ex.Message);
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                ASCIIEncoding encoder = new ASCIIEncoding();

                //Send Back ...
                Console.WriteLine(encoder.GetString(message, 0, bytesRead));
                clientStream.Write(message, 0, message.Length);


                /* ####### Erweiterung (s.u.) ######## */


            }
            tcpClient.Close();
        }
    }
}


Das ganze arbeitet einwandfrei ... ABER:
Nun erweitere ich den Code wie folgt ( bei ####### ERWEITERUNG ######):


C#-Quelltext
1:
2:
3:
4:
                byte[] img = File.ReadAllBytes("c:\\1.jpg");
                
                message = encoder.GetBytes(img.Length+"\n");
                clientStream.Write(message, 0, message.Length);


Das erste mal lesen klappt. Er schickt mir die Dateigrösse rüber. Schicke ich dann aber einen erneuten Request (in Form einer beliebigen Zeichenfolge) schlägt NetworkStream.Read fehl und ich erhalte folgende Fehlermeldung (ex.Message im catch-Block):

Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
Parametername: size

Hat da jmd. eine Idee? Fange gerade mit c# an und weiss echt nicht mehr, wo ich noch suchen soll. Vorstellen könnte ich mir irgendetwas ungültiges im Eingans oder Ausgangspuffer ... aber wer weiss...

Deswegen frage ich ja hier die Profis ;-)

Für jeden Tipp, Kommentar, Lösung, etc ... Herzlichen Dank

Gruß,
littleman


Kha - Di 05.05.09 16:30

:welcome:

Überlege dir mal, welche Größe "message" beim zweiten Aufruf hat ;) ...


littleman - Di 05.05.09 16:53

hmpf .... manche Dinge können so einfach sein ... :D
DANKE!