Frage

Ich versuche, einen einfachen C # Web-Server, der zu diesem Zeitpunkt zu machen, können Sie über Ihren Browser zugreifen können und werden nur eine „Hallo Welt“ tun.

Das Problem ist, ich habe, dass der Server Daten in Ordnung empfangen kann - ich erhalte den Header-Informationen Browser - aber der Browser nichts empfängt ich sende. Darüber hinaus kann ich nur mit dem Server verbindet von localhost gehen (oder 127.0.0.1). Ich kann nicht, indem Sie auf meine IP um es zu bekommen und es ist keine Netzwerkeinstellung, weil Apache funktioniert gut, wenn ich, dass statt laufen. Außerdem bin ich ein Port Monitoring-Programm und nachdem ich eine Verbindung von einem Browser versuchen, den Hafen der Prozess wird in einem TIME_WAIT Zustand stecken, obwohl ich die Verbindung sagte zu schließen und es sollte wieder hört.

Hier ist der relevante Code. Ein paar Anrufe unter Umständen nicht sinnvoll, aber das ist ein Stück eines größeren Programms.

class ConnectionHandler
{
    private Server server;

    private TcpListener tcp;

    private ArrayList connections;

    private bool listening;

    private Thread listeningThread;

    public Server getServer()
    {
        return server;
    }

    private void log(String s, bool e)
    {
        server.log("Connection Manager: " + s, e);
    }

    private void threadedListen()
    {
        while (listening)
        {
            try
            {
                TcpClient t = tcp.AcceptTcpClient();
                Connection conn = new Connection(this, t);
            }
            catch (NullReferenceException)
            {
                log("unable to accept connections!", true);
            }
        }
        log("Stopped listening", false);
    }

    public void listen()
    {
        log("Listening for new connections", false);
        tcp.Start();
        listening = true;
        if (listeningThread != null && listeningThread.IsAlive)
        {
            listeningThread.Abort();
        }
        listeningThread = new Thread(new ThreadStart(
            this.threadedListen));
        listeningThread.Start();
    }

    public void stop()
    {
        listening = false;
        if (listeningThread != null)
        {
            listeningThread.Abort();
            log("Forced stop", false);
        }
        log("Stopped listening", false);
    }

    public ConnectionHandler(Server server)
    {
        this.server = server;
        tcp = new TcpListener(new IPEndPoint(
            IPAddress.Parse("127.0.0.1"), 80));
        connections = new ArrayList();
    }
}

class Connection
{
    private Socket socket;
    private TcpClient tcp;

    private ConnectionHandler ch;

    public Connection(ConnectionHandler ch, TcpClient t)
    {
        try
        {
            this.ch = ch;
            this.tcp = t;
            ch.getServer().log("new tcp connection to " 
                + this.tcp.Client.RemoteEndPoint.ToString(), false);
            NetworkStream ns = t.GetStream();

            String responseString;
            Byte[] response;
            Int32 bytes;
            responseString = String.Empty;
            response = new Byte[512];
            bytes = ns.Read(response, 0, response.Length);
            responseString = 
                System.Text.Encoding.ASCII.GetString(response, 0, bytes);
            ch.getServer().log("Received: " + responseString);

            String msg = "<html>Hello World</html>";
            String fullMsg = "HTTP/1.x 200 OK\r\n"
                    + "Server: Test Server\r\n"
                    + "Content-Type: text/html; "
                        + "charset=UTF-8\r\n"
                    + "Content-Length: " + msg.Length + "\r\n"
                    + "Date: Sun, 10 Aug 2008 22:59:59 GMT"
                        + "\r\n";
            nsSend(fullMsg, ns);
            nsSend(msg, ns);

            ns.Close();
            tcp.Close();
        }
        catch (ArgumentNullException e)
        {
            ch.getServer().log("connection error: argument null exception: " + e);
        }
        catch (SocketException e)
        {
            ch.getServer().log("connection error: socket exception: " + e);
        }
    }

    private void nsSend(String s, NetworkStream ns)
    {
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(s);
        ns.Write(data, 0, data.Length);
        ns.Flush();
        ch.getServer().log("Sent: " + s);
    }
}

Hat jemand irgendwelche Ideen? Es fühlt sich an wie es muss etwas dumm von mir, aber ich weiß nur nicht, was. Ich würde wirklich keine Einsicht schätzen

War es hilfreich?

Lösung

Vielleicht möchten Sie wissen, dass Sie verwenden können, HttpListener einen grundlegenden Web-Server sehr leicht zu schreiben - das mit den meisten der schmerzhaften Bits behandelt, die Sie auf dem schreiben den eigentlichen Code konzentrieren lassen. Die MSDN-Seite gibt ein Beispiel.

Beachten Sie, dass diese verwendet HTTP.SYS, was gut ist - aber bedeutet, dass Nicht-Administratoren müssen explizit angegeben Zugang werden, um Ports zu öffnen; auf XP können Sie dies mit httpcfg; auf Vista können Sie netsh verwenden. Siehe hier mehr.

Andere Tipps

Eine Sache, die kein Problem im Moment ist, aber vielleicht später sein, dass Ihre Inhalte Länge auf dem Unicode Länge der Nachrichtenkette basiert, nicht auf die binär Länge.

Es gibt auch ziemlich viel im Connection-Konstruktor los - Sachen, die überhaupt in einem Konstruktor gehört nicht wirklich, IMO. Es ist in der Nähe auch nicht Dinge, wenn Ausnahmen auftreten.

Haben Sie sehen, was wie Wireshark in einem Netzwerk Tracer ist los? Das wäre der einfachste Weg, zu sehen, ob jeder Daten wird immer an den Client gesendet zurück.

Alternativ senden Sie uns eine kurze, aber vollständige Version des Codes, die wir kompilieren und ausführen können uns selbst.

Vielleicht bin ich gerade etwas fehlt, aber der Grund, warum Sie nur auf localhost verbinden kann, ist, weil die IP Sie hören 127.0.0.1 ist, das macht nur die TcpListener auf dieser IP-Adresse hört. Und ich nirgendwo sehen Sie alle Client trennen anrufen, ist die TcpListener ein blockierender Aufruf, so sitzt sie dort für immer, bis eine Verbindung hergestellt ist. In meiner bisherigen Erfahrungen mit TCP / IP und den TcpListener gibt es TCPClient Klassen nicht viel von einer Art und Weise den Hörer zu zwingen, es ist Verbindung zu trennen, bis Sie die Client-Verbindung fallen. Der Aufruf TCPListener.Abort () fallen nicht die Client-Verbindung, die den Hafen hält blockiert.

Für jedermann in ähnlicher Situation, wo Sie möchten, dass Sie C # für den Zugriff auf Server aus dem lokalen Netzwerk IP-Adresse, dann müssen Sie hören 0.0.0.0 Bedeutung auf alle IP-Adressen hören Adresse kein spezifisches wie 127.0.0.1 usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top