RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
最简单的http服务器实现
  • 作者:zhaozj
  • 发表时间:2020-12-23 10:37
  • 来源:未知

现在有很多功能强大的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);