Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C++CLI / VB .Net / .Net-Framework » Multi Threaded Socks Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.03.2008, 13:14 Uhr
~MultiSocks
Gast


Hallo,


Code:


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Threading;



namespace test
{
    
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        TcpListener tl = new TcpListener(81);
            
        
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
            
        }
        
        void Panel1Paint(object sender, PaintEventArgs e)
        {
            
        }
        
        public string Write (string text)
        {
            if (this.txtid.InvokeRequired)
                {
                       this.txtid.Invoke((MethodInvoker)delegate()
                       {
                        this.txtid.Text += text + "\r\n" ;
                        
                    }
                );
                }
                else
                {
                        this.txtid.Text += text + "\r\n";
                        
                }
                return "done";
        }
        void StartToolStripMenuItemClick(object sender, EventArgs e)
        {
            // Starte den Thread
            Thread[] ta = new Thread[10];
            ta[1] = new Thread(new ThreadStart(listen));
            ta[1].Start();
        }
        
        public Socket handle_client (Socket insocket)
        {
            NetworkStream ns = new NetworkStream(insocket);
            StreamWriter sw = new StreamWriter(ns);
            StreamReader sr = new StreamReader(ns);
                
            sw.WriteLine("Accepted");
            sw.Flush();
                
            Write("Connection From: "+ insocket.RemoteEndPoint.ToString());
            
            return insocket;
        }
        
        public void listen ()
        {
            tl.Start();
            Socket so = tl.AcceptSocket();
            /*TcpListener tl = new TcpListener(81);
            tl.Start();
            
            Socket so = tl.AcceptSocket();*/
            if (so.Connected)
            {
                /*NetworkStream ns = new NetworkStream(so);
                StreamWriter sw = new StreamWriter(ns);
                StreamReader sr = new StreamReader(ns);
                
                sw.WriteLine("Accepted");
                sw.Flush();
                
                Write(so.RemoteEndPoint.ToString());*/
                
                Thread[] th = new Thread[2];
                th[1] = new Thread(new ThreadStart(listen));
                th[1].Start();    
                
                handle_client(so);
                
            }
        }
        
        void MainFormLoad(object sender, EventArgs e)
        {
            
        }
        
        
        
        void CommandToolStripMenuItemClick(object sender, EventArgs e)
        {
            Form1 form1 = new Form1();
            form1.Show();
        }
    }
}




Wie man anhand des Codes sieht, ist das ein Server der auf Port 81 nach eingehende Verbindungen horcht! Er ist multi threading fähig, da er für jede Connection einen eigenen Thread spawnt. Sprich es können auch 10 Clients gleichzeitig darauf verbinden.
Was ich aber haben will ist, dass ich jeden Client einzeln killen kann, sprich die Verbindung zum Server terminieren.

Wie man sieht wir auf einer Form in einem Textfeld der Text "Connection From: IP Adresse und Port" angezeigt. Angenommen 10 Clients verbinden sich, dann sehe ich im Textfeld 10x "Connection From ... ..".
Was ich nun will ist, dass ich auf einen Client in diesem Textfeld klicken kann (muss kein Textfeld sein kann auch ein Button sein) und dann eine Auswahl habe dem die Verbindung zum Server zu terminieren.

An was scheiterts?
Bei mir scheiterts logisch daran, wie ich weiß mit welchem Thread ich kommunizieren muss. Für 10 Verbindungen werden ja 10 Threads geöffnet, nun ist eben die Frage wie weiß ich welcher Thread für welchen Client zuständig ist? Und wie kann ich diesem Thread dann sagen er soll dem Client z.B. den Text "Close_Connection" senden?


DAnke für die schnelle Hilfe
LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.03.2008, 15:35 Uhr
Th



Hä, was machst du denn da mit den lokalen Arrays?

Du legst dir einfach eine Liste von (Socket, Thread) Werten als Member deiner Hauptklasse an (ich würde diese Klasse aber aus der MainForm auslagern!), z.B. als Dictionary<Socket, Thread>.
Dann kannst du anhand des Sockets den zugehörigen Thread ermitteln.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C++CLI / VB .Net / .Net-Framework ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: