Autor Beitrag
littleman
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 05.05.09 15:58 
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):

ausblenden volle Höhe 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 ######):

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 05.05.09 16:30 
:welcome:

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

_________________
>λ=
littleman Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 05.05.09 16:53 
hmpf .... manche Dinge können so einfach sein ... :D
DANKE!