Arjuna Aircraft Ident.: F-MBSD | 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 :
- using System;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- using System.Windows.Forms;
- //using System.Collections.Generic;
- //using System.ComponentModel;
- //using System.Data;
- //using System.Drawing;
- namespace WebServer
- {
- public partial class Form1 : Form
- {
- Thread t;
- public Form1()
- {
- InitializeComponent();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- private void button1_Click(object sender, EventArgs e)
- {
- StartApplication();
- }
- private void button2_Click(object sender, EventArgs e)
- {
- StopApplication();
- }
- private void StartApplication()
- {
- pictureStatus.Image = WebServer.Pictures.intermediate;
- StartListenThread();
-
- pictureStatus.Image = WebServer.Pictures.started;
- }
- private void StopApplication()
- {
- pictureStatus.Image = WebServer.Pictures.intermediate;
- StopListenThread();
- pictureStatus.Image = WebServer.Pictures.stopped;
- }
- private void StartListenThread()
- {
- t = new Thread(new ThreadStart(ListenThread));
- t.Start();
- }
- private void ListenThread()
- {
- TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1" ), 80);
- listener.Start(255);
- listener.Server.Blocking = false;
- while (true)
- {
- try
- {
- TcpClient client = new TcpClient();
- try
- {
- client = listener.AcceptTcpClient();
- }
- catch (SocketException se)
- {
- client = null;
- }
- if (client != null)
- {
- client.Client.Blocking = true;
- NetworkStream stream = client.GetStream();
- string txt = string.Empty;
- byte[] buffer = new byte[4096];
- long read = 0;
- while (stream.DataAvailable)
- {
- read += stream.Read(buffer, 0, buffer.Length);
- txt += Encoding.ASCII.GetString(buffer);
- }
- stream.Write(Encoding.ASCII.GetBytes("HTTP/1.1 100 Continue\r\n\r\n" ), 0, 25);
- ProcessedRequest processed = ProcessRequest(txt.TrimEnd());
- if (processed.errorCode != string.Empty)
- {
- string header1 = "HTTP/1.0 " + processed.errorCode + "\r\n";
- string header2 = (processed.typeMime != string.Empty) ? "Content-Type: " + processed.typeMime : string.Empty;
- string message = (processed.message != null) ? "\r\nContent-Length: " + processed.message.LongLength.ToString() + "\r\n\r\n" + Encoding.ASCII.GetString(processed.message) : string.Empty;
- byte[] reponse = Encoding.ASCII.GetBytes(header1 + header2 + message);
- stream.Write(reponse, 0, reponse.Length);
- }
- stream.Close();
- stream.Dispose();
- client.Close();
- }
- }
- catch (ThreadAbortException e)
- {
- Thread.ResetAbort();
- break;
- }
- }
- listener.Stop();
- }
- private void StopListenThread()
- {
- t.Abort();
- t.Join();
- }
- private ProcessedRequest ProcessRequest(string request)
- {
- ProcessedRequest ret = new ProcessedRequest();
- if (request.Length > 0)
- {
- string[] requestLines = request.Split(new string[] { "\r\n" }, StringSplitOptions.None);
- string[] method = requestLines[0].Split(' ');
- switch (method[0])
- {
- case "GET":
- ret.errorCode = "200 OK";
- ret.message = Encoding.ASCII.GetBytes("<html><body><p><a href=\"toto\">Youpi</a></p><fieldset><legend>Recieved:</legend><pre>" + request + "</pre></fieldset></body></html>" );
- ret.typeMime = "text/html";
- break;
- default:
- ret.errorCode = "501 Not Implemented";
- ret.message = null;
- ret.typeMime = string.Empty;
- break;
- }
- }
- return ret;
- }
- private struct ProcessedRequest
- {
- public string errorCode;
- public string typeMime;
- public byte[] message;
- }
- }
- }
|
Pour le moment, ça fait pas grand chose
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 :
- NetworkStream stream = client.GetStream();
- string txt = string.Empty;
- byte[] buffer = new byte[4096];
- long read = 0;
- while (stream.DataAvailable)
- {
- read += stream.Read(buffer, 0, buffer.Length);
- txt += Encoding.ASCII.GetString(buffer);
- }
|
|