Normalerweise darf jede Socketadresse nur jeweils einmal verwendet werden ???



  • Hey,
    ich versuch seit mehreren tagen ein Server zu programmieren rein zur Übung
    nur kommt bei mir Folgender fehler.

    Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden

    hier mal die instgesammte connect klasse:

    [code]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    //This ClassLibary is make by Dagnih all Rights Reserved
    //ESAR(Easy Send and Recive Class)
    namespace ESAR
    {
        public class ESARC
        {
            Socket sock = null;
            public int maxlisten = 1000000;
            //////////////////////////////////////////////////////////////////
            /*                    Setzt maxlisten                           */
            public void setMaxListenClients(int ml)
            {
                this.maxlisten = ml;
            }
            //////////////////////////////////////////////////////////////////
            public void setsock(Socket sockh)
            {
                this.sock = sockh;
            }
            //////////////////////////////////////////////////////////////////
            /*               Server:  Akzeptiert die Client's               */
            public bool serverAcceptESAR()
            { 
                sock.Listen(maxlisten);
                this.sock = sock.Accept();
                return true;
            }
            //////////////////////////////////////////////////////////////////
    
            //////////////////////////////////////////////////////////////////
            /*               Server: Stellt verbindung für den server bereit*/
            public void serverDoAllESAR(int port)
            {
                this.serverConnectESAR(port);
                this.serverAcceptESAR();
            }
            public Socket serverConnectESAR(int port)
            {
                this.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint lep = new IPEndPoint(IPAddress.Any, port);
                sock.Bind(lep);//????????????//
                return sock;
            }
    
            public Socket clientConnectESAR(IPAddress ip, int port)
            {
                this.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sock.Connect(ip, port);
                return sock;
            }
            public int sendESAR(String text)
            /*Returns:
                       0 = No Error
            */
            {
                byte[] data = System.Text.Encoding.ASCII.GetBytes(text);
    
                this.sock.Send(data);
                return 0;
            }
    
            public string[] waitESAR()
            {
                byte[] data = new byte[2048];
                int reclenght;
                string [] ret = new String[2];
                try
                {
                    reclenght = this.sock.Receive(data);
                    ret[0] = System.Text.Encoding.ASCII.GetString(data, 0, reclenght);
                    ret[1] = "Erfolg";
                    return ret;
                }
                catch
                {
                    ret[0] = "";
                    ret[1] = "ERROR 1";
                    return ret;
                }
    
            }
        }
    }
    
    [/code]
    

    und hier die server klasse

    [code]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ESAR;
    using System.Threading;
    
    namespace serv
    {
        class Program
        {
            static void Main(string[] args)
            {
                int maxcons = 10000;
                ESARC[] all = new ESARC[maxcons];
                for(int i = 0; i<maxcons; i++)
                {
                    all[i] = new ESARC();
                    all[i].serverDoAllESAR(10000);
    
                    serv.Program t1_ = new serv.Program();
                    Thread t1 = new Thread(delegate(){
                        t1_.tr1(all[i]);
                    });
                }
            }
            public void tr1(ESARC one)
            {
                one.waitESAR();
            }
        }
    }
    
    [/code]
    

    Ich hoffe ihr könnt mir helfen weil ich komm nicht so ganz weiter ich weis das es was mit dem binding zu tun hat aber ich versteh das problem nicht und weis genauso wenig wie ich es lösen soll

    Danke schonmal im Vorraus 🙂



  • keiner da der sich mit netweork programming auskennt ? :o



  • Du versuchst 10000 mal auf IPAddress.Any:10000 zu lauschen, es kann aber immer nur ein Socket gleichzeitig pro IP:Port Kombination lauschen.

    Erstelle nur einen Socket der auf Port 10000 lauscht und erstelle Threads erst in deiner serverAcceptESAR()

    Edit:
    Mit TcpListener kannst du dir übrigens ein wenig Code einsparen:

    TcpListener server = new TcpListener(IPAddress.Any, 10000);
    server.Start(); // Auf Port 10.000 wird nun gelauscht
    while(true) 
    {
       Console.Write("Auf Verbindung eines Clients warten...");
       TcpClient client = server.AcceptTcpClient();            
       Console.WriteLine("Jemand hat sich verbunden!!");
       // Hier jetzt Thread für das client-Objekt starten ;D
    }
    

Anmelden zum Antworten