By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,383 Members | 2,080 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,383 IT Pros & Developers. It's quick & easy.

a simple http server

P: n/a
hi,
i am creating an simple http server ie it serves only static pages .
u can compile the code then use ur browser if it is IE then the it
shows the page but the http header is also shown
HTTP/1.0 200 OK Content-Type: text/html
nweb Web Server Sorry:
but if the browser is mozilla/Firefox it shows the recieved data as an
application and tells me to save it.
also i want that the program should continiously listen on the port and
send data to more than one client

also is it possible to invoke a thread that calls a function with
arguments
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

class Program
{
static int BUFSIZE= 8096;
enum msg
{
ERROR =42,
SORRY =43,
LOG = 44,
}

static void log(msg type,string s1,string s2) //used for logging
of errors
{
string logfile = "http.log";
string logbuffer;
FileStream file = new FileStream(logfile, FileMode.Append);
StreamWriter sw = new StreamWriter(file);
switch (type)
{
case msg.ERROR: logbuffer = "Error: " + s1 +" "+ s2 + "
exiting ";
sw.WriteLine(logbuffer);
sw.WriteLine();
sw.Close();
break;
case msg.SORRY: logbuffer = "sorry: " + s1 + " " + s2 + "
";
sw.WriteLine(logbuffer);
//add funtion to send data to user;
sw.WriteLine();
sw.Close();
break;
case msg.LOG: logbuffer = "info: " + s1 + " " + s1 + " ";
sw.WriteLine(logbuffer);
sw.WriteLine();
sw.Close();
break;
}
if (type == msg.ERROR || type == msg.SORRY)
{
System.Environment.Exit(0);
}

}
public static extn[] fileextsused( )
{
extn []extentions =new extn[10];
extentions[1].ext= "gif";
extentions[1].filetype="image/gif" ;
extentions[2].ext="jpg";
extentions[2].filetype="image/jpeg";
extentions[3].ext="png";
extentions[3].filetype= "image/png";
extentions[4].ext="zip";
extentions[4].filetype="image/zip";
extentions[5].ext="gz";
extentions[5].filetype= "image/gz";
extentions[6].ext="tar";
extentions[6].filetype= "image/tar";
extentions[7].ext="htm";
extentions[7].filetype="text/html";
extentions[8].ext="html";
extentions[8].filetype="text/html";
extentions[9].ext="0";
extentions[9].filetype="0";
return extentions;

}
public struct extn
{
public String ext;
public string filetype;
}
public static void web(Socket suck ) //used for sending data to
the //client
{
Encoding enc = Encoding.Unicode;
byte [] rbuffer =new byte[BUFSIZE+1];//recieve buffer
byte [] sbuffer =new byte[BUFSIZE+1];//data to be send
byte[] header = enc.GetBytes("HTTP/1.0 200
OK\r\nContent-Type: %s\r\n\r\n");//http header
string str="<HTML><BODY><H1>nweb Web Server
Sorry:</H1></BODY></HTML>\r\n";//actual page

sbuffer = enc.GetBytes(str);
suck.Receive(rbuffer);
suck.Send(header);
suck.Send(sbuffer);

}

static void Main(string[] args)
{
DirectoryInfo dir;

args = new string[2];
args[0] = "80";
args[1] = @"c:\a";
int port;
port = Convert.ToInt32(args[0]);
dir = new DirectoryInfo(args[1]);

int i=0;
extn []extentions =new extn[10];
extentions=fileextsused();
if (args.Length <2 || args.Length >2 || args[0] == "/?")
{
Console.WriteLine("hint: nweb Port-Number
Top-Directory\n\n"+
"\tnweb is a small and very safe mini web server\n"+
"\tnweb only servers out file/web pages with extensions named
below\n"+
"\t and only from the named directory or its
sub-directories.\n"+
"\tThere is no fancy features = safe and secure.\n\n"+
"\tExample: nweb 8181\n c:\\web &\n\n"+
"\tOnly Supports:");
for(i=0;i<extentions.Length;i++)
{

Console.WriteLine("\t"+extentions[i].ext+"\t"+extentions[i].filetype+"");
}

Console.WriteLine("\n\tNot Supported: URLs including
\"..\",Java, Javascript, CGI\n"+
"\tNot Supported: directories \n\tc:\\ " + "\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.System)+"\n\t"

+Environment.GetFolderPath(Environment.SpecialFold er.ProgramFiles) +
"\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.CommonProgramFiles)+"\n"
+"\tNo warranty given or implied\n\tUmesh Tangnu
um**********@gmail.com\n");
Console.ReadLine();
System.Environment.Exit(0);
}

else
{
if ((args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.System)) ||
(args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.Personal)) ||
(args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.ProgramFiles)))
{
Console.WriteLine("ERROR: Bad top directory "+
args[1]+" see nweb /?\n");
Console.ReadLine();

System.Environment.Exit(0);
}
if(!dir.Exists)
{
Console.WriteLine("ERROR : Top Directory
"+args[1]+" doesnot exist");
Console.Read();
System.Environment.Exit(0);
}

}
if (port < 0 || port > 60000)
log(msg.ERROR, "Invalid port number (try 1->60000)",
args[0]);
log(msg.LOG, "nweb starting", args[0]);

IPAddress iadd =IPAddress.Parse("192.168.1.2");
IPEndPoint ipe = new IPEndPoint(iadd, port);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ipe);
sock.Listen(32);
sock = sock.Accept();
web(sock);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}

Dec 1 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
I can't help with the headers issue (I just use HttpListener to do this via
HTTP.SYS), however re the threading Q:

I usually do this by creating a class with some properties (representing the
params), setting the params against an instance and then using a void
Start() method on the instance as the delegate to ThreadStart; my Start
method can then read the params against the same instance. Got this from
MSDN I think (so shouldn't be *too* far from the norm - maybe) - might be
better ways, though...

Marc

"lucifer" <um**********@gmail.com> wrote in message
news:11**********************@o13g2000cwo.googlegr oups.com...
hi,
i am creating an simple http server ie it serves only static pages .
u can compile the code then use ur browser if it is IE then the it
shows the page but the http header is also shown
HTTP/1.0 200 OK Content-Type: text/html
nweb Web Server Sorry:
but if the browser is mozilla/Firefox it shows the recieved data as an
application and tells me to save it.
also i want that the program should continiously listen on the port and
send data to more than one client

also is it possible to invoke a thread that calls a function with
arguments
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

class Program
{
static int BUFSIZE= 8096;
enum msg
{
ERROR =42,
SORRY =43,
LOG = 44,
}

static void log(msg type,string s1,string s2) //used for logging
of errors
{
string logfile = "http.log";
string logbuffer;
FileStream file = new FileStream(logfile, FileMode.Append);
StreamWriter sw = new StreamWriter(file);
switch (type)
{
case msg.ERROR: logbuffer = "Error: " + s1 +" "+ s2 + "
exiting ";
sw.WriteLine(logbuffer);
sw.WriteLine();
sw.Close();
break;
case msg.SORRY: logbuffer = "sorry: " + s1 + " " + s2 + "
";
sw.WriteLine(logbuffer);
//add funtion to send data to user;
sw.WriteLine();
sw.Close();
break;
case msg.LOG: logbuffer = "info: " + s1 + " " + s1 + " ";
sw.WriteLine(logbuffer);
sw.WriteLine();
sw.Close();
break;
}
if (type == msg.ERROR || type == msg.SORRY)
{
System.Environment.Exit(0);
}

}
public static extn[] fileextsused( )
{
extn []extentions =new extn[10];
extentions[1].ext= "gif";
extentions[1].filetype="image/gif" ;
extentions[2].ext="jpg";
extentions[2].filetype="image/jpeg";
extentions[3].ext="png";
extentions[3].filetype= "image/png";
extentions[4].ext="zip";
extentions[4].filetype="image/zip";
extentions[5].ext="gz";
extentions[5].filetype= "image/gz";
extentions[6].ext="tar";
extentions[6].filetype= "image/tar";
extentions[7].ext="htm";
extentions[7].filetype="text/html";
extentions[8].ext="html";
extentions[8].filetype="text/html";
extentions[9].ext="0";
extentions[9].filetype="0";
return extentions;

}
public struct extn
{
public String ext;
public string filetype;
}
public static void web(Socket suck ) //used for sending data to
the //client
{
Encoding enc = Encoding.Unicode;
byte [] rbuffer =new byte[BUFSIZE+1];//recieve buffer
byte [] sbuffer =new byte[BUFSIZE+1];//data to be send
byte[] header = enc.GetBytes("HTTP/1.0 200
OK\r\nContent-Type: %s\r\n\r\n");//http header
string str="<HTML><BODY><H1>nweb Web Server
Sorry:</H1></BODY></HTML>\r\n";//actual page

sbuffer = enc.GetBytes(str);
suck.Receive(rbuffer);
suck.Send(header);
suck.Send(sbuffer);

}

static void Main(string[] args)
{
DirectoryInfo dir;

args = new string[2];
args[0] = "80";
args[1] = @"c:\a";
int port;
port = Convert.ToInt32(args[0]);
dir = new DirectoryInfo(args[1]);

int i=0;
extn []extentions =new extn[10];
extentions=fileextsused();
if (args.Length <2 || args.Length >2 || args[0] == "/?")
{
Console.WriteLine("hint: nweb Port-Number
Top-Directory\n\n"+
"\tnweb is a small and very safe mini web server\n"+
"\tnweb only servers out file/web pages with extensions named
below\n"+
"\t and only from the named directory or its
sub-directories.\n"+
"\tThere is no fancy features = safe and secure.\n\n"+
"\tExample: nweb 8181\n c:\\web &\n\n"+
"\tOnly Supports:");
for(i=0;i<extentions.Length;i++)
{

Console.WriteLine("\t"+extentions[i].ext+"\t"+extentions[i].filetype+"");
}

Console.WriteLine("\n\tNot Supported: URLs including
\"..\",Java, Javascript, CGI\n"+
"\tNot Supported: directories \n\tc:\\ " + "\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.System)+"\n\t"

+Environment.GetFolderPath(Environment.SpecialFold er.ProgramFiles) +
"\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\n\t"
+
Environment.GetFolderPath(Environment.SpecialFolde r.CommonProgramFiles)+"\n"
+"\tNo warranty given or implied\n\tUmesh Tangnu
um**********@gmail.com\n");
Console.ReadLine();
System.Environment.Exit(0);
}

else
{
if ((args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.System)) ||
(args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.Personal)) ||
(args[1] ==
Environment.GetFolderPath(Environment.SpecialFolde r.ProgramFiles)))
{
Console.WriteLine("ERROR: Bad top directory "+
args[1]+" see nweb /?\n");
Console.ReadLine();

System.Environment.Exit(0);
}
if(!dir.Exists)
{
Console.WriteLine("ERROR : Top Directory
"+args[1]+" doesnot exist");
Console.Read();
System.Environment.Exit(0);
}

}
if (port < 0 || port > 60000)
log(msg.ERROR, "Invalid port number (try 1->60000)",
args[0]);
log(msg.LOG, "nweb starting", args[0]);

IPAddress iadd =IPAddress.Parse("192.168.1.2");
IPEndPoint ipe = new IPEndPoint(iadd, port);
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ipe);
sock.Listen(32);
sock = sock.Accept();
web(sock);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}

Dec 1 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.