С# и сокеты

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by [NiGHT]DarkAngel, 8 May 2009.

  1. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Пишу программку,ее основой является мини подобие http сервера,проблема заключается в следующем,когда из студии я компилирую проект,запускает сервер и я могу обратиться к нему браузером и сервер вернет браузере ответ,который соответственно я увижу в окне браузера... но если я не перезапуская свой сервер попрошу отдать в браузер другую страничку,то браузер пишет,что не может соединиться с сервером :( ... помогите пожалуйста решить проблему,заранее очень сильно благодарен.

    ЗЫ Сильно ногами за код не пинать,только учусь :rolleyes:

    PHP:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;

    namespace 
    http_agent
    {

        class 
    http_serv
        
    {
            private const 
    int MAX_BUFFER 4096;
            private const 
    string notfound "HTTP/1.1 404 File not found\n\n";
            private const 
    string header_send "HTTP/1.1 200 OK\nServer: tinyHttp\nConnection: close\nContent-Type: text/html\n\n";
            
    Socket listenfd null;
            
    IPEndPoint pe null;

            public 
    int initHTTPServ()
            {           
              
              
    //if(listenfd.) listenfd.Close(); -- проверить существует ли сокет,если да то закрыть его...
                
    listenfd = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                
    pe = new IPEndPoint(IPAddress.Any8080);

                
    listenfd.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,false);        

                
    listenfd.Bind(pe);

                
    listenfd.Listen(1);
     
                
    System.Console.WriteLine("HTTP Server start ...");
                return 
    0;
            }

            public 
    void checkHttpServer()
            {
                
    //Подключаемся к сокету и вызываем функцию обслуживания запроса
                
    handleConnection(listenfd.Accept());         
            }


            public 
    string getFileName(string inbufint start)
            {
                
    int i start0;
                
    string ret "";
                
    char[] outs = new char[80 1];

                while (
    inbuf[i] == ' 'i++;
               
                for (; 
    inbuf.Lengthi++)
                {
                    if (
    inbuf[i] == ' ')
                    {
                        break;
                    }
                    
    outs[j++] = inbuf[i];               
                }

                
    ret = new string(outs,0,j);

                if (
    ret == "/")                 
                {                
                    
    ret "/index.html";
                }

                return 
    ret;           
            }

            public 
    void emitHTTPResponseHeader(Socket connfd)
            {
                
    connfd.Send(Encoding.ASCII.GetBytes(header_send));
            }

            public 
    void handleConnection(Socket connfd)
            {
                
    Console.WriteLine("Handle Connections...");
                
    int lenmaxloop;
                
    byte[] buffer = new byte[http_serv.MAX_BUFFER+1];
                
    string filename "";
                
    string str_in_sock "";

                
    max 0loop 1;
                while (
    loop == 1
                {
                 
    len connfd.Receive(buffer);
                 
    buffer[max+len] = 0;
                 if (
    len <= 0) return;
                 
    max += len;            
                 if ((
    buffer[max-4] == 0x0d) && (buffer[max-3] == 0x0a) && (buffer[max-2] == 0x0d) && (buffer[max-1] == 0x0a)) loop 0;            
                }

                
    str_in_sock Encoding.ASCII.GetString(buffer0max);

                if (
    str_in_sock.Substring(03) == "GET")  //если метод GET 
                
    {

                    
    filename getFileName(str_in_sock4); //получаем имя запрашиваемого файла файла
                 
          
                
    if      (filename == "/index.html") { Console.WriteLine("GET /index.html");}//emitNews( connfd );
                
    else if (filename == "/config.html") { Console.WriteLine("GET /config.html");} //emitConfig( connfd );
                
    else if (filename == "/art") { Console.WriteLine("GET /art"); } //emitArticle( connfd, filename );
                
    else 
                {             
                    
    connfd.Send(Encoding.ASCII.GetBytes(notfound));
                    
    connfd.Close();
                    
    Console.WriteLine("GET Not Found");
                }

              }else if (
    str_in_sock.Substring(04) == "POST")  //Если метод POST
               
    {

                
    filename getFileName(str_in_sock4);

               if (
    filename == "/clear"
               {
                
    //clearEntries();
                
    emitHTTPResponseHeader(connfd);
                
    buffer Encoding.ASCII.GetBytes("<P><H1>Нажмите назад и перезагрузите страницу</H1><P>\n\n");
                
    connfd.Send(buffer);
               } else 
               {
                 
    connfd.Send(Encoding.ASCII.GetBytes(notfound));
                 
    connfd.Close();
               }
             } 
             else 
             {
                
    connfd.Send(Encoding.ASCII.GetBytes("HTTP/1.1 501 Not Implemented\n\n"));
               
             }
            }        
        }


        class 
    Program
        
    {
            static 
    void Main(string[] args)
            {
               
    http_serv serv = new http_serv();
               
    serv.initHTTPServ();
               
    serv.checkHttpServer();
               
    System.Console.ReadLine();
            }
        }
    }
     
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Не удивительно, ведь ты же обрабатываешь только один запрос пользователя, после чего программа просто заканчивает выполнение...

    Нужно handleConnection(listenfd.Accept()); хотя бы в цикле выполнять. А лучше асинхронно или с потоками...
     
  3. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Спасибо огромное,во я дурак то :)
     
  4. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Подниму небольшой вопросик про сокеты опять :) ... Можно пинать меня сильно , но главное что бы было за что :-D... есть вот такой код

    PHP:
                nntp_he Dns.GetHostEntry(nntpServer);

                foreach(
    IPAddress tmp_ip_serv in nntp_he.AddressList)
                {
                    
    ip_nntp_serv tmp_ip_serv;
                }

                
    nntp_conn = new Socket(AddressFamily.InterNetworkSocketType.StreamProtocolType.Tcp);
                
    nntp_ep = new IPEndPoint(ip_nntp_serv119);

                
    Console.WriteLine("Соединяемся с " nntpServer);

                
    nntp_conn.Connect(nntp_ep);

                
    buffer = new byte[gVarible.MAX_LINE 1];
                
    nntp_conn.Receive(buffer);
                
    Console.WriteLine(Encoding.ASCII.GetString(buffer));


                
    buffer null;

                
    nntp_conn.Send(Encoding.ASCII.GetBytes("c"));

                
    Console.WriteLine("q");

                
    byte[] buffer2 = new byte[1024];

                
    Console.WriteLine("q2");

                
    nntp_conn.Receive(buffer2);

                
    Console.WriteLine("q3");

                  
    Console.WriteLine(Encoding.ASCII.GetString(buffer2));

    Проблема в том что он всего лишь один раз принимает данные из сокета ,после соединения,а когда я отправляю серверу через открытый с ним сокет данные ,а затем пытаюсь прочитать....

    nntp_conn.Receive(buffer2);
    Console.WriteLine("q3");
    Console.WriteLine(Encoding.ASCII.GetString(buffer2));

    Вот эта часть кода вообще не выполняется,доходит только до Console.WriteLine("q2"); и все,буду безумно благодарен и поставлю плюсики от всей души,если поможите разобраться с этой проблемкой.Заранее спасибо!
     
  5. Juda

    Juda Elder - Старейшина

    Joined:
    2 Aug 2008
    Messages:
    48
    Likes Received:
    8
    Reputations:
    0
    Может полный исходник кинь. Чтоб и сервер и клиент было видно.
     
    #5 Juda, 24 May 2009
    Last edited: 24 May 2009
  6. Juda

    Juda Elder - Старейшина

    Joined:
    2 Aug 2008
    Messages:
    48
    Likes Received:
    8
    Reputations:
    0
    вот исходник чата на C#. Посмотри че да как. http://sourceforge.net/project/downloading.php?group_id=71539&filename=SharpChat-1.1.1.zip&a=95975655
     
  7. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Это и был клиент,а в роли сервера выступает сервер nntp новостей,к которому я тут соответственно и подключаюсь
     
  8. Juda

    Juda Elder - Старейшина

    Joined:
    2 Aug 2008
    Messages:
    48
    Likes Received:
    8
    Reputations:
    0
    Чувак, у тебя есть исходник, комп, мозг, дебагер и еще есть MSDN, в котором куча примеров по сокетам. Пройдись дебагером по коду (не по мозгам ;) ), посмотри че не работает. Смысл два дня ждать ответа на форуме, если самому можно за часик все склепать. :)
     
  9. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Что "и все"? Выпадает ошибка? Какая?
    Поставь try, отлови ошибку.
     
  10. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Вот именно что ошибки никакой нет :( ,просто не выполняется дальше код ... не один из трех исключения для сокета через catch не выпадает ... возьму совет Juda пойду дебаггером и снифером :)
     
  11. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Все тема клоусед,разобрался косяк был мой в 2 символах , когда я посылал серверу через сенд в конце не писал \r\n и поэтому сервак думал что я еще не закончил отправлять данные ему и принимать соответственно от сервера нечего было :(