Multithreaded Socks PRogramm Control



  • Hallo,

    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



  • Am besten du erstellst dir eine Klasse
    in der Klasse kannst du einen Thread und eine ip speichern

    class Connection
    {
    
    private Thread thread;
    private string ip;
    public Connection(Thread thread, string ip)
    {
    this.thread = thread;
    this.ip = ip;
    }
    
    public Thread{ get; set; }//ab c#3.0
    public Ip {get; set; }/ab c#3.0
    }
    //Dann noch eine Liste
    List<Connection listConnection = new List<Connection>();
    //Connection hinzufügen
    listConnection.Add(new Connection(thread, ip));
    //Connection anhand von IP Löschen
    for(int i=0; i<listConnection.Count; i++)
    {
    if(listConnection[i].ip == "192.168.2.1")
    {
    //jezt hast du den richtigen thread
    listConnection[i].thread;
    }
    }
    

    Sollte so erstmal funktionieren (ungetestet)



  • Besser wäre ein KeyValuePair
    [cs]
    List<KeyValuePair<string, Thread>> list = new List<KeyValuePair<string, Thread>>();
    list.Add(new KeyValuePair("192.168.0.1", thread));
    //...
    //...

    Schau am besten mal in die MSDN



  • Hallo,

    Nicht böse gemeint aber ich verstehe nicht ganz wie ich das jetzt in mein Programm einbetten sollte usw... :S



  • using System.Collections;
    //...
    Dictionary<string, Thread> list = new Dictionary<string, Thread>();
    list.Add("192.168.0.2", new Thread(new ThreadStart(listen)));
    list["192.168.0.2"].Start();
    //Du kannst nun mit 
    list["192.168.0.2"].//Auf alle Funktionen von Thread drauf zugreifen
    //Statt Thread kannst du auch andere Klassen nehmen(TcpListener, ...)
    //Wenn du eine neue Verbindung hast:
    list.Add("IP VOM CLIENT", NEUER THREAD S.O);
    
    Thread[] ta = new Thread[10];
    ta[1] = new Thread(new ThreadStart(listen));
    ta[1].Start();
    

    Was soll diese Code bewirken?
    Bei MenuItemKlick erstellst du ein neues Thrad-Array/Überschreibst es und startest einen Thread und das wars.


Anmelden zum Antworten