最近工作忙,没时间研究代码,正好今天在单位值班,研究了下http服务器的实现,之前做后台经常用apache和IIS服务器,这次查了下资料写个简单的http服务器,个人比较喜欢用javascript编写hta应用程序,可是js功能太弱了,实现了http服务器,就可以用特殊端口让javascript和c++交互,js不能做的事情交给c++处理,不多说,先上代码。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, “wsock32.lib”)
#include <iostream>
#define port 8888 //监听端口
using namespace std;
int main()
{
WSAData wsa;
if (::WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
cout<<"WSAStartup error"<<endl;
return 0;
}
//创建socket套接字
SOCKET localFd = socket(AF_INET, SOCK_STREAM, 0);
if (localFd == INVALID_SOCKET)
{
cout << "socket 错误!" << endl;
exit(-1);
}
//sockaddr_in结构体:可以存储一套网络地址(包括IP与端口)
struct sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(port); //绑定端口
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定本机IP地址
//将网络地址与套接字绑定
int res = bind(localFd, (struct sockaddr *)&localAddr, sizeof(localAddr));
if (res == -1)
{
cout << "绑定错误!" << endl;
exit(-1);
}
//监听试图连接本机的客户端,监听的进程数这里设置为20
listen(localFd, 20);
cout << "服务运行中...." << endl;
while (true)//接收客户端的请求
{
//创建sockaddr_in结构体,用来存储客户机的地址
struct sockaddr_in clientAddr;
int len = sizeof(clientAddr);
//阻塞运行,直到收到某一客户机的连接请求,并返回客户机的描述符
int clientFd = accept(localFd, (struct sockaddr *)&clientAddr, &len);
if (clientFd == -1)
{
cout << "accept错误\n"
<< endl;
exit(-1);
}
//客户端的信息
char *ip = inet_ntoa(clientAddr.sin_addr);
cout << "客户端: " << ip << " 连接到本服务器成功!" << endl;
//输出客户端请求头
char buff[1024] = {0};
int size = recv(clientFd, buff, sizeof(buff),0);
cout << "Request information:\n"
<< buff << endl;
cout << size << " bytes" << endl;
//向客户端发送响应头及string
char* html="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>欢迎使用sdxjwkq01的服务器</h1><hr>";
send(clientFd, html, strlen(html),0);
closesocket(clientFd);
}
}
注释解释的很详细了,这个用了winsock2.h和windows.h头文件,要是linux环境头文件要修改一下,recv()和send()两个方法也要相应的改成read()和write().
这个是运行后的效果,时间不早了,暂且完成这些,等有时间再完善下它的功能,get方法,post方法,delete方法啥的,再加点接口。
?
?
|