实现一个简单的http服务器,能够将本地电脑作为一个后台服务器供客户端访问。
该实现只是一个简单的原型,用户跨域访问。
1,创建一个私有的socket,采用IP地址+端口号的形式访问,例如:http://192.168.0.123:3030/test.html
创建socket(tcp):
localfd = socket(AF_INET,SOCK_STREAM, 0)
设置socket选项参数:
setsockopt(localfd, SOL_SOCKET, SO_REUSEADDR, &resue, sizeof(int))
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(3030);
local_addr.sin_addr.s_addr = INADDR_ANY;
绑定socket参数到创建的socket上:
bind(localfd, (struct sockaddr*)&local_addr, sizeof(struct sockaddr))
设置本地socket的监听
listen(localfd, 5)
2,创建一个捕获消息的循环,在该循环中捕获客户端的请求,分发请求命令并处理:
捕获用户请求消息:
char buffer[512]
fd = accept(localfd, (struct sockaddr*)&remote_addr, (socklen_t*)&addr_len)
msgLen = recv(fd, buffer, 512, 0)
如果msgLen>0,则处理用户请求消息
3,处理用户请求消息,根据状态作出相应的回复。
stringstream responseOK;
responseOK << "HTTP/1.1 200 OK\r\nContent-Type:text/plain\r\nContent-Length:" <<"0" << "\r\n\r\n";
if (cmdline.find("test.html") != string::npos)
{
response << "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"
<<nFilesize<< "\r\n\r\n" << buffer;
send(fd, response.str().c_str(), response.str().length(), 0)
}
else if (cmdline.find("test.js") != string::npos)
{
response << "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:"
<<nFilesize<< "\r\n\r\n" << buffer;
send(fd, response.str().c_str(), response.str().length(), 0);
}
else if(cmdline.find("para") != string::npos)
该项是类似与http://192.168.0.123:3030/test.html?para=1,处理后进行类似的回复
这样,在用户请求某些参数时,server就能够作出相应的处理后回复。