Autor Beitrag
Bonkers
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 04.03.10 15:46 
Hallo,

ich habe da eine Problem mit meiner Socket Verbindung. Ich schreibe grad ein Programm welches Daten an den localhost schickt und ein anderes (Java) Programm Connected sich zu diesem Socket Server und bekommt die Daten zugeschickt (Windows Mobile 6.1). Doch leider funktioniert das freigeben des Sockets nicht. Wenn ich das C# Programm beende, scheint der Socket immer noch offen zu sein und lässt dann keine Neuverbindung zu. Und wenn ich den "Disconnect" Button Drücke stürzt das Programm komplett ab und lässt sich danach nicht mehr starten...

Hier mal mein Code:


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:
// Wenn Button "Connect" gedrückt wurde
private void button1_Click(object sender, EventArgs e)
{
     thread = new Thread(new ThreadStart(this.WorkerThreadFunction));
     thread.Start();
     ...
}


        // Thread
        private void WorkerThreadFunction()
        {
            ip = new IPEndPoint(IPAddress.Loopback, 8000);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(ip);
            socket.Listen(5);
            SocketInfo = "Warte auf Client...";
            this.Invoke(new EventHandler(DisplayTextSocket));
            try {
                client = socket.Accept();
                clientep = (IPEndPoint)client.RemoteEndPoint;
                SocketInfo = "Client verbunden...";
                this.Invoke(new EventHandler(DisplayTextSocket));
                clientCon = true;
            }
            catch (SocketException se)
            {
                 SocketInfo = "Socket konnte nicht geöffnet werden!\n" + se; 
                 this.Invoke(new EventHandler(DisplayTextSocket));
            }
        }
 

        // Wenn Button "Disconnect" gedrückt wurde
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (socket != null)
                {
                    socket.Close();
                    client.Close();
                    SocketInfo = "Getrennt!";
                    this.Invoke(new EventHandler(DisplayTextSocket));
                    clientCon = false;
                }
            }
            catch (Exception ex1)
            {
                SocketInfo = "Konnte nicht getrennt werden!";
                this.Invoke(new EventHandler(DisplayTextSocket));
            }
            button1.Enabled = true;
            button2.Enabled = false;
        }



Was mache ich falsch bzw. wie mache ich es richtig?

DANKE
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.03.10 16:27 
Hallo und :welcome:,

er nimmt keine Verbindung mehr entgegen, weil du nur einmal auf eine Verbindung wartest. Sprich du müsstest in deiner WorkerThreadFunction eine Schleif um die socket.Accept() bauen, damit er ständig neue Verbindungen annimmt.

Wenn dein Programm abstürzt, wäre die Exception hilfreich. Ich vermute aber sie liegt bei Zeile 42 ... egal... ;)

Generell kannst du dir Arbeit ersparen, wenn du einen TcpListener verwendest. Dieser erstellt auch eine Socket Verbindung. Darüber hinaus erlaubt es dir aber sämtliche Funktionen bequem asynchron aufzurufen, z.B.:

ausblenden C#-Quelltext
1:
2:
3:
            TcpListener server = new TcpListener(IPAddress.Loopback, this.Port);
            server.Start();
            server.BeginAcceptSocket(new AsyncCallback(AcceptSocket), _listener);


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
      public void AcceptSocket(IAsyncResult result)
        {
            // Get the listener that handles the client request.
            TcpListener listener = (TcpListener)result.AsyncState;

            Socket client = listener.EndAcceptSocket(result);

            // Handle client ...

            // Wait for further connections
            _listener.BeginAcceptSocket(new AsyncCallback(AcceptSocket), _listener);
         }


Gruß Daniel
Bonkers Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 04.03.10 16:36 
Danke erstmal!

Aber wenn ich den Connected Button erneut drücke, dann startet er ja einen neuen Thread, wo wieder die accept Geschichte aufgerufen wird oder sehe ich das falsch?

Also ich starte das Prog. - drücke auf Connect - dann drücke ich z.B. auf Disconnect und dann tut sich nix mehr. Auch keine Exception, es hängt einfach und lässt sihc danach nicht mehr starten.

Wenn ich es dann einfach neu drauf kopire kommt die Meldung "System.Net.Sockets.Bind()", also wird da wohl iwo der Fehler liegen, da der Socket noch offen ist oder?


Werde das gleich mal mit deinem code versuche - kann ich darüber dann auch sachen an den client schicken?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.03.10 16:55 
Ja klar, in Zeile 6 holt man sich die Client-Socket Verbindung. Über die bekommst du den einen Stream zum schreiben und lesen.

Stimmt das mit dem Neuen Thread und nochmal accept hab ich übersehen.. und genau daran liegt da Problem :) Du musst den Socket nur einmal Binden und Listen aufrufen und bei den nächsten male nur noch socket.Accept();

Dennoch ist das mit dem TcpListener eine elegantere Lösung und du wirst sehen du hast weniger Probleme :)

Gruß Dainel
Bonkers Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 04.03.10 19:14 
Das scheint zu funtkionieren :-) (mit tcplister.stop();)

Habe nun auch herausgefunden warum das Programm imm erabstsürzt beim Disconnecten... Ich öffne noch einen ComPORT um an die GPS Daten zu kommen und der EventHandler macht Probleme wenn ich den Port Close...

ausblenden C#-Quelltext
1:
this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);					


Hat da jemand auch noch ne Idee?
Programm stürzt ab, lässt sich nicht neu starten und gibt auch keine Exception aus...