最简单的http服务器实现
現在有很多功能強大的http服務器,APACHE,IIS我們應該都很熟悉
其實眾多的http服務器都有個最基本的工作流程:
1.初始化工作環境,在固定端口(80)偵聽外部請求
2.接收請求
3.建立連接
4.發送響應頭部
5.發送響應內容
6.中斷連接
下面是個最簡單的http服務器的例子,用winsock實現
為什么是最簡單的呢,因為它接收到請求后,發送的響應頭部和響應內容都是直接指定的
不能區別不同的get,post,head 請求。
#include "winsock.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#pragma comment (lib,"wsock32")///所需的庫文件
void main()
{
?/初始化winsock環境
?WSADATA wsadata;
?WORD wVersion=MAKEWORD(2,0);/winsock 2.0
?if(WSAStartup(wVersion,&wsadata)!=0)
?{
??printf("initalize failed!\n");
??WSACleanup();
??exit(1);
?}
?
?int sock,csock,length;//sock是服務器端偵聽套接字,csock是客戶端連接套接字
?length=sizeof(struct sockaddr);
?struct sockaddr_in server_ipaddr,client_ipaddr;//用來獲得服務器和客戶端的地址信息
?memset(&server_ipaddr,0,length);
?server_ipaddr.sin_family=AF_INET;
?server_ipaddr.sin_port=htons(80);
?server_ipaddr.sin_addr.s_addr=inet_addr("211.81.55.200");
?char buff[4096];int nbuff;
?sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
///綁定
?if(bind(sock,(struct sockaddr *)&server_ipaddr,length)==SOCKET_ERROR)
?{
??printf("Bind error\n");
??WSACleanup();
??exit(1);
?}
偵聽
?if(listen(sock,5)==SOCKET_ERROR)
?{
??printf("Listen error\n");
??WSACleanup();
??exit(1);
?}
?/
?char headers[1000];//保存頭部
?/頭部格式
?char hdrFmt[]=
??"HTTP/1.0 200 OK\r\n"
??"Server: MySocket Server\r\n"
??"Date: %s\r\n"
??"Content-Type: text/html\r\n"
??"Accept-Ranges: bytes\r\n"
??"Content-Length: %d\r\n\r\n";
?char * strGmtNow="08/15/14 22:53:00 GMT";///隨便指定了一個時間
?wsprintf(headers, hdrFmt, (const char*) strGmtNow, strlen(CustomHtml));
?//要傳送的網頁內容
?char CustomHtml[]=
??"<html>\r\n"
??"<head>\r\n"
??"<title></title>\r\n"
??"</head>\r\n"
??"<body>\r\n"
??"<p align=\"center\">歡迎訪問我的主頁</p>\r\n"
??"<h3 align=\"center\"><a href=\"Default.htm\">快樂天地</a></h3>\r\n"
??"<p>結束</p>\r\n"
??"<p> </p>\r\n"
??"</body></html>\r\n\r\n";
?
?
?//
?while(1)
?{
??//偵聽到連接后,產生新的套接字
??///用來和客戶端傳遞消息
??csock=accept(sock,(struct sockaddr *)&client_ipaddr,&length);
??if(csock==SOCKET_ERROR)
??{
???printf("Listen error\n");
???WSACleanup();
???exit(1);
??}
??nbuff=recv(csock,buff,4095,0);
???buff[nbuff]='\0';
??printf("%s",buff);
?/發送響應頭部
??send(csock,headers,strlen(headers),0);
?/發送內容?
??send(csock,CustomHtml,strlen(CustomHtml),0);
?/關閉本次連接
??closesocket(csock);
?
?}
?
}
轉載于:https://www.cnblogs.com/MaxWoods/archive/2010/02/02/1661445.html
總結
以上是生活随笔為你收集整理的最简单的http服务器实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java注解(Annotation)详解
- 下一篇: 未来的新兴产业有哪些 带你了解新兴产业