今天突然对http的web服务器感兴趣了,就研究了一下,发现linux下的web服务器就是一个socket编程的服务器端,而我们用的ie,chrome等浏览器就是客户端,只不过发送和接收数据按照http网页格式,就相当于对数据进行了封装,相当于加上了文件头和文件尾等一些规定的东西罢了。下面有一个简单的web服务器程序,网上找的,用了,感觉不错,分享一下。
当今很多http协议的服务器已经成熟化比如apache iis nginx 想想这些运行在服务器上的程序,利用tcp原理进行http协议的页面元素传输,这里有个简易原理程序。
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
main()
{
int sk1,sk2;
int len = 0;
char buff[4096];
struct sockaddr_in cli_addr;
char msgret[4096];
memset( msgret, 0x00, sizeof(msgret) );
if( (sk1=socket(AF_INET, SOCK_STREAM, 0)) < 0 )
printf( "socket failed\n" );
printf( "creat socket success: %d\n", sk1 );
struct sockaddr_in sa;
memset( &sa, 0x00, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr( "192.168.0.111" );//服务器的ip地址,这里必须和你的电脑的相同
sa.sin_port = htons( 13800 );//端口号
if( bind(sk1, (struct sockaddr*)&sa, sizeof(sa)) < 0 )
printf( "bind socket failed\n" );
listen( sk1, 100 );
while( 1 )
{
len = sizeof(cli_addr);
sk2 = accept( sk1, (struct sockaddr*)&sa, (socklen_t*)&len );
if( sk2 < 0 )
printf( "create accept socket failed\n" );
else
{
printf( "accept socket: %d\n", sk2 );
memset( buff, 0x00, sizeof(buff) );
len = read( sk2, buff, 4096);
printf( "msg recv: %s\n", buff );
sprintf( msgret, "HTTP/1.1 200 OK\n"
"Date: Fri, 02 Mar 2012 01:59:03 GMT\n"
"Server: Apache"
"Location: http://www.sina.com.cn/\n"
"Cache-Control: max-age=60\n"
"Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"
"Vary: Accept-Encoding\n"
"Content-Length: 231\n"
"Content-Type: text/html; charset=iso-8859-1\n"
"X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"
"Connection: close\n\n"
"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
"<html><head>\n"
"<title>title test</title>\n"
"</head><body>\n"
"<h1>test body</h1>\n"
"<p>Hello,I am web server!</p>\n"//打印的文字内容
"</body></html>" );
len = send( sk2, msgret, sizeof(msgret), 0 );
if( len <= 0 )
{
printf( "send failed\n" );
}
}
}
}
访问web服务器就相当于用客户端即浏览器采用http协议连接访问服务器端,我们看到网页就相当于服务器端将本地的网页文件发送到你的电脑,你的电脑浏览器作为客户端将网页显示出来!
在浏览器运行结果如图所示