Serveur web : déconne avec FF mais pas IE

Serveur web : déconne avec FF mais pas IE - C#/.NET managed - Programmation

Marsh Posté le 24-05-2006 à 00:25:25    

Salut,
Je suis en train de m'amuser à faire un petit serveur web pour le fun.
J'en ai chié un max, et finalement en deux heures j'en suis arrivé à ce truc...
 

Code :
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Windows.Forms;
  7. //using System.Collections.Generic;
  8. //using System.ComponentModel;
  9. //using System.Data;
  10. //using System.Drawing;
  11. namespace WebServer
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         Thread t;
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.         private void Form1_Load(object sender, EventArgs e)
  21.         {
  22.         }
  23.         private void button1_Click(object sender, EventArgs e)
  24.         {
  25.             StartApplication();
  26.         }
  27.         private void button2_Click(object sender, EventArgs e)
  28.         {
  29.             StopApplication();
  30.         }
  31.         private void StartApplication()
  32.         {
  33.             pictureStatus.Image = WebServer.Pictures.intermediate;
  34.             StartListenThread();
  35.            
  36.             pictureStatus.Image = WebServer.Pictures.started;
  37.         }
  38.         private void StopApplication()
  39.         {
  40.             pictureStatus.Image = WebServer.Pictures.intermediate;
  41.             StopListenThread();
  42.             pictureStatus.Image = WebServer.Pictures.stopped;
  43.         }
  44.         private void StartListenThread()
  45.         {
  46.             t = new Thread(new ThreadStart(ListenThread));
  47.             t.Start();
  48.         }
  49.         private void ListenThread()
  50.         {
  51.             TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1" ), 80);
  52.             listener.Start(255);
  53.             listener.Server.Blocking = false;
  54.             while (true)
  55.             {
  56.                 try
  57.                 {
  58.                     TcpClient client = new TcpClient();
  59.                     try
  60.                     {
  61.                         client = listener.AcceptTcpClient();
  62.                     }
  63.                     catch (SocketException se)
  64.                     {
  65.                         client = null;
  66.                     }
  67.                     if (client != null)
  68.                     {
  69.                         client.Client.Blocking = true;
  70.                         NetworkStream stream = client.GetStream();
  71.                         string txt = string.Empty;
  72.                         byte[] buffer = new byte[4096];
  73.                         long read = 0;
  74.                         while (stream.DataAvailable)
  75.                         {
  76.                             read += stream.Read(buffer, 0, buffer.Length);
  77.                             txt += Encoding.ASCII.GetString(buffer);
  78.                         }
  79.                         stream.Write(Encoding.ASCII.GetBytes("HTTP/1.1 100 Continue\r\n\r\n" ), 0, 25);
  80.                         ProcessedRequest processed = ProcessRequest(txt.TrimEnd());
  81.                         if (processed.errorCode != string.Empty)
  82.                         {
  83.                             string header1 = "HTTP/1.0 " + processed.errorCode + "\r\n";
  84.                             string header2 = (processed.typeMime != string.Empty) ? "Content-Type: " + processed.typeMime : string.Empty;
  85.                             string message = (processed.message != null) ? "\r\nContent-Length: " + processed.message.LongLength.ToString() + "\r\n\r\n" + Encoding.ASCII.GetString(processed.message) : string.Empty;
  86.                             byte[] reponse = Encoding.ASCII.GetBytes(header1 + header2 + message);
  87.                             stream.Write(reponse, 0, reponse.Length);
  88.                         }
  89.                         stream.Close();
  90.                         stream.Dispose();
  91.                         client.Close();
  92.                     }
  93.                 }
  94.                 catch (ThreadAbortException e)
  95.                 {
  96.                     Thread.ResetAbort();
  97.                     break;
  98.                 }
  99.             }
  100.             listener.Stop();
  101.         }
  102.         private void StopListenThread()
  103.         {
  104.             t.Abort();
  105.             t.Join();
  106.         }
  107.         private ProcessedRequest ProcessRequest(string request)
  108.         {
  109.             ProcessedRequest ret = new ProcessedRequest();
  110.             if (request.Length > 0)
  111.             {
  112.                 string[] requestLines = request.Split(new string[] { "\r\n" }, StringSplitOptions.None);
  113.                 string[] method = requestLines[0].Split(' ');
  114.                 switch (method[0])
  115.                 {
  116.                     case "GET":
  117.                         ret.errorCode = "200 OK";
  118.                         ret.message = Encoding.ASCII.GetBytes("<html><body><p><a href=\"toto\">Youpi</a></p><fieldset><legend>Recieved:</legend><pre>" + request + "</pre></fieldset></body></html>" );
  119.                         ret.typeMime = "text/html";
  120.                         break;
  121.                     default:
  122.                         ret.errorCode = "501 Not Implemented";
  123.                         ret.message = null;
  124.                         ret.typeMime = string.Empty;
  125.                         break;
  126.                 }
  127.             }
  128.             return ret;
  129.         }
  130.         private struct ProcessedRequest
  131.         {
  132.             public string errorCode;
  133.             public string typeMime;
  134.             public byte[] message;
  135.         }
  136.     }
  137. }


 
Pour le moment, ça fait pas grand chose :D
 
Par contre, chose étrange : avec IE, aucun problème. Mais avec FF, j'ai quelquefois une erreur "la connection a été fermée par le serveur durant le transfert patati patata".
 
Qu'est-ce qu'il me veut ?
 
J'ai noté que dans ce cas, ProcessRequest me retourne "null", c'est à dire que je n'ai pas reçu de requête de la part de Moz... Il s'est connecté, mais ne m'a rien envoyé, et s'est déconnecté aussitôt en me donnant cette erreur.
 
Du coup, j'ai l'impression que c'est ça qui déconne :
 

Code :
  1. NetworkStream stream = client.GetStream();
  2.                         string txt = string.Empty;
  3.                         byte[] buffer = new byte[4096];
  4.                         long read = 0;
  5.                         while (stream.DataAvailable)
  6.                         {
  7.                             read += stream.Read(buffer, 0, buffer.Length);
  8.                             txt += Encoding.ASCII.GetString(buffer);
  9.                         }

Reply

Marsh Posté le 24-05-2006 à 00:25:25   

Reply

Marsh Posté le 24-05-2006 à 10:16:17    

je sens que je ferais mieu d'enculer les mouches, ça aurait plus d'effet...

Reply

Marsh Posté le 24-05-2006 à 12:31:30    

Arjuna a écrit :

je sens que je ferais mieu d'enculer les mouches, ça aurait plus d'effet...

 


un up de soutien ? :D
comme je vois que tu n'as pas toujours des réponses sur tes topics, je viens te tenir companie  :hello:  
 

Reply

Marsh Posté le 24-05-2006 à 14:02:23    

c'est gentil ça :)
 
j'ai toujours le problème.
 
par ailleurs, j'ai voulu virer la couche "TcpClient / TcpListener" pour les remplacer par des Socket, et non plus bosser en partie en mode Blocking, et surtout, passer en assynchrone.
Pas pigé pourquoi, j'ai jamais pu tester, il me dit tout le temps que j'ai un problème de permission :spamafote:
 
Du coup, je suis revenu en arrière, et j'ai fait évoluer le moteur de réponse. Maintenant, je sais aller chercher un fichier sur le HD, retrouver le type mime via un fichier XML (faudra peut-être que je pense à aller voir dans la BDR aussi, ça serait pas plus mal), et renvoyer le contenu, quel que soit son encodage (donc maintenant je sais lire des fichier texte, mais aussi des images notamment :))
 
Reste plus qu'à trouver un intérêt à mon serveur... :D
 
Chose chelou par contre... Chez moi (AMD 3500+ avec 2 Go DDR) c'est ultra rapide. Par contre, au boulot (Centrino 1500 avec 512 Mo DDR) c'est méga lent pour charger une page... Et je semble avoir plus de problèmes de connection que chez moi (j'ai des timeout dans IE)
 
Chelou... :sweat:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed