一个能够兼容所有特性的HTTP服务器是十分复杂的,特别是一些可选项,或者是一些非传统非标准的字段的处理,更是超级麻烦
下面这个小的web server程序,不仅仅是类socket服务端接收程序,还可以返回给客户端,可以当一个测试程序,测试客户端和代理交互情况;当然如果你手快用C语言来写Socket交互,那么请直接跳过就行了
#!/usr/bin/perl -w
use Socket;
use Carp;
use FileHandle;
#use port 8080 by default ,unless overridden on command line
$port = (@ARGV ? $ARGV[0] : 8080);
#create local TCP socket and set it to listen for connections
$proto = getprotobyname("tcp");
socket(S, PF_INET, SOCK_STREAM, $proto) || die;
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, 1) || die;
bind(S, sockaddr_in($port, INADDR_ANY)) || die;
listen(S, SOMAXCONN) || die;
#print a startup message
printf("HTTP Server Accepting on Port %d:\n\n", $port);
while(1){
#wait for a connection C
$cport_caddr = accept(C, S);
($cport, $caddr) = sockaddr_in($cport_caddr);
C->autoflush(1);
#print who the connection is from
$cname = gethostbyaddr($caddr, AF_INET);
printf("Request From: '%s'\n", $cname);
#read request msg until blank line, and print on screen
while ($line = <C>){
print $line;
if ($line =~ /^\r/) { last; };
}
#prompt for response message, and input response lines,
#sending response lines to client, until solitary "."
printf("Type Response Followed by '.'\n");
while ($line = <STDIN>){
$line =~ s/\r//;
$line =~ s/\n//;
if ($line =~ /^\./) { last; }
print C $line . "\r\n";
}
close(C);
}
可以看到中间也是通过socket服务端来接收数据,socket,bind,listen,accept等;这里直接用一个python脚本来通过socket模拟client向9999端口发送一些http信息
服务端 [lihui@localhost ~]# ./web.pl 9999 HTTP Server Accepting on Port 9999: Request From: '' GET / HTTP/1.1 Host: lihuia.com Connection:keep-alive Cache-Control:max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Type Response Followed by '.' 客户端 [lihui@localhost ~]# ./client.py
