سؤال

وأنا أحاول أن جعل C # خادم الويب بسيط أنه، في هذه المرحلة، يمكنك الوصول إليها عبر المتصفح الخاص بك، وسوف نفعل مجرد "مرحبا أيها العالم".

والمشكلة أواجه أن الملقم يمكن الحصول غرامة البيانات - I الحصول على معلومات رأس المتصفح - ولكن المتصفح لا يتلقى أي شيء أبعث. وعلاوة على ذلك، يمكنني فقط الاتصال بالخادم عن طريق الذهاب إلى المضيف المحلي (أو 127.0.0.1). لا أستطيع الحصول عليه عن طريق الذهاب الى بلدي IP وليس إعداد شبكة لأباتشي يعمل بشكل جيد إذا قمت بتشغيل بدلا من ذلك. أيضا، أنا باستخدام برنامج رصد الميناء وبعد أن محاولة اتصال من مستعرض، ومنفذ العملية ويحصل عالقا في حالة TIME_WAIT حتى ولو قلت للاتصال لإغلاق ويجب أن تكون العودة إلى الاستماع.

وهنا رمز ذات الصلة. A المكالمات الزوجين قد لا يكون له معنى ولكن هذا هو قطعة من برنامج أكبر.

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);
    }
}

هل لديها أي أفكار؟ بدا الامر وكأننا انها يجب ان يكون شيئا غبيا من جانبي ولكني لا أعرف ما. وسأكون ممتنا حقا أي فكرة

هل كانت مفيدة؟

المحلول

وربما ترغب في معرفة التي يمكنك استخدامها HttpListener لإرسال بريد الويب الأساسي خادم بسهولة جدا - وهذا يتعامل مع أكثر من البتات مؤلمة، مما يتيح لك التركيز على كتابة الرمز الفعلي. الصفحة MSDN يعطي مثالا على ذلك.

لاحظ أن هذا يستخدم HTTP.SYS، وهو أمر جيد - ولكن يعني أن عدم مدراء-ضرورة أن تعطى صراحة الوصول إلى فتح منافذ. ويندوز إكس بي يمكنك القيام بذلك مع httpcfg. على ويندوز فيستا يمكنك استخدام netsh. انظر> وأ href = "https://stackoverflow.com/questions/169904/can-i-listen-on-a-port-using-httplistener-or-other-net-code-on-vista-without-re# 195256 "> هنا لأكثر من ذلك.

نصائح أخرى

وشيء واحد وهي ليست مشكلة في الوقت الحالي ولكن قد يكون في وقت لاحق أن طول المحتوى الخاص بك على أساس <م> يونيكود طول السلسلة الرسالة، وليس <م> ثنائي الطول.

وهناك أيضا بدلا الكثير مما يجري في منشئ اتصال - الاشياء التي حقا لا تنتمي في منشئ في كل شيء، والمنظمة البحرية الدولية. كما أنها لا تغلق أشياء في حالة حدوث استثناءات.

هل نظرت إلى ما يحدث في التتبع شبكة مثل يريشارك؟ وسيكون ذلك أسهل طريقة لرؤية ما اذا كان <م> أي هو الحصول على إرسال البيانات إلى العميل.

وبدلا من ذلك، إضافة نسخة قصيرة ولكن كاملة من التعليمات البرمجية التي يمكننا ترجمة وتشغيل أنفسنا.

وربما أنا فقط في عداد المفقودين شيء ولكن السبب يمكنك الاتصال فقط على المضيف المحلي هو لأن IP الذي يتم الاستماع على هو 127.0.0.1، وهذا يجعل TCPListener استماع فقط على عنوان IP. وأنا لا أرى أي مكان كنت استدعاء أي قطع العميل، TCPListener دعوة حظر، حتى أنه يجلس هناك الى الابد حتى يتم إجراء اتصال. في تجربتي السابقة مع TCP / IP والطبقات TCPListener، TCPClient ليس هناك الكثير من وسيلة لإجبار المستمع لإسقاط انها اتصال حتى قمت بإسقاط اتصال العميل. داعيا TCPListener.Abort () لا إسقاط اتصال العميل والتي تحافظ على ميناء منعت حتى.

لأي شخص في وضع مماثل حيث تريد الوصول لك C # الملقم من عنوان بروتوكول الإنترنت الشبكة المحلية ثم سوف تحتاج للاستماع لمعالجة 0.0.0.0 معنى الاستماع على كافة عناوين بروتوكول الإنترنت ليست واحدة محددة مثل 127.0.0.1 الخ

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top