Знатаки выручайте

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by chaby, 7 Aug 2011.

  1. chaby

    chaby Banned

    Joined:
    27 Jul 2010
    Messages:
    5
    Likes Received:
    1
    Reputations:
    -5
    Code:
    using System;
    using System.Text;
    using System.IO;
    using System.Collections;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace HTTPServer
    {
        public class Interaction
        {
            const string Server_Directory = "content";
            const string Error_Message = "None";
            const string Main_Page = "nsu.htm";
    
            TcpClient Client;
            Hashtable Contents = new Hashtable();
            /// <summary>
            /// По строке запроса вычисляем путь к файлу.
            /// </summary>
            public string GetPath(string request)
            {
                int space1 = request.IndexOf(" ");
                int space2 = request.IndexOf(" ", space1 + 1);
                string url = request.Substring(space1 + 2, space2 - space1 - 2);
                if(url == "")
                    url = Main_Page;
                return Server_Directory + url;
            }
            /// <summary>
            /// По файлу вычисляем тип содержимого в нём
            /// </summary>
            public string GetContent(string file_path)
            {
                string ext = "";
                int dot = file_path.LastIndexOf(".");
                if(dot >= 0)
                    ext = file_path.Substring(dot, file_path.Length - dot).ToUpper();
                if(Contents[ext] == null)
                    return "application/" + ext;
                else
                    return (string)Contents[ext];
            }
            /// <summary>
            /// Отправляем заголовок клиенту.
            /// </summary>
            public void WriteHeaderToClient(string content_type, long length)
            {
                string str = "HTTP/1.1 200 OK\nContent-type: " + content_type 
                       + "\nContent-Encoding: 8bit\nContent-Length:" + length.ToString() 
                       + "\n\n";
                Client.GetStream().Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
            }
            /// <summary>
            ///  Отвечаем на запрос клиенту
            /// </summary>
            public void WriteToClient(string request)
            {
                string file_path = GetPath(request);
                if(file_path.IndexOf("..") >= 0 || !File.Exists(file_path) ) 
                {
                    WriteHeaderToClient("text/plain", Error_Message.Length);
                    Client.GetStream().Write(Encoding.ASCII.GetBytes(Error_Message), 0, Error_Message.Length);
                    return;
                }
                FileStream file = File.Open(file_path, FileMode.Open);
                WriteHeaderToClient(GetContent(file_path), file.Length);
                byte[] buf=new byte[1024];
                int    len;
                while((len = file.Read(buf,0,1024)) != 0)
                    Client.GetStream().Write(buf, 0, len);
                file.Close();
            }
            public void Interact()
            {
                try
                {
                    byte[] buffer = new byte[1024];
                    string request = "";
                    while(true)
                    {    
                        int count = Client.GetStream().Read(buffer, 0, 1024);
                        request += Encoding.ASCII.GetString(buffer, 0, count);
                        if(request.IndexOf("\r\n\r\n") >= 0) // Запрос обрывается \r\n\r\n последовательностью
                        {
                            WriteToClient(request);
                            request = "";
                        }
                    }
                }
                catch(Exception) 
                {
                }
            }
            protected void SetContents()
            {
                Contents.Add("", "application/unknown");
                Contents.Add(".HTML", "text/html");
                Contents.Add(".HTM", "text/html");
                Contents.Add(".TXT", "text/plain");
                Contents.Add(".GIF", "image/gif");
                Contents.Add(".JPG", "image/jpeg");
            }
            public Interaction(TcpClient client)
            {
                Client = client;
                SetContents();
                Thread interact = new Thread(new ThreadStart(Interact));
                interact.Start();
            }
        }
    
        public class Server
        {
            private TcpListener Listener;
    
            public Server(int port)
            {
                Listener = new TcpListener(port);
                Listener.Start();
                Listen();
            }
            ~Server()
            {
                if (Listener!= null)
                    Listener.Stop();
            }
            /// <summary>
            /// Ждём подключений к нашему серверу и обрабатываем их
            /// </summary>
            public void Listen()
            {
                while(true)
                    new Interaction(Listener.AcceptTcpClient());
            }
            [STAThread]
            static void Main(string[] args)
            {
                Server server = new Server(8123);
            }
        }
    }
    вот этот код создает локальный сервер на компе но поддерживает только хтмл как сделать чтоб он обрабатывал php
     
  2. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    ипортируеш из php-шной динмаичекской библиотеки нужные функции и используешь в программе. сложность только в том, что php-реализаций для net не встречается а на оффсайте лежат библиотеки\исходники для win32, поэтому придется импорт делать как из win32 библиотек и включать поддержку небезопасного кода
     
  3. chaby

    chaby Banned

    Joined:
    27 Jul 2010
    Messages:
    5
    Likes Received:
    1
    Reputations:
    -5
    кто сможет готовое решение предоставить)))
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Разработчики PHP за много-много твоих денег.
     
  5. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Вообще то несложно реализовать поддержку PHP в своем Web сервере. Достаточно запустить на выполнение
    Code:
    <путь к файлу php.exe> <путь к скрипту>
    и получить вывод консоли. Далее все что получили выводим клиенту. Поддержка PHP в Web сервере реализована.
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    А передача $_GET, $_POST, кукисов, аплоад файлов на сервер и еще много всякого? Не так и просто.
     
  7. chaby

    chaby Banned

    Joined:
    27 Jul 2010
    Messages:
    5
    Likes Received:
    1
    Reputations:
    -5
    вот и я о том же