源码如下:
#include"tcpSocket.hpp"
#include<sstream>
#include <sys/types.h>
#include <sys/stat.h> //umask
#include <cstdlib> //exit
#include <unistd.h> //fork、setsid、chdir、close
#include <signal.h> //signal
//精灵进程的创建
void myDaemon_Init()
{
//1.消除文件默认权限掩码的影响
umask(0);
//2.创建进程,让父进程退出,保证守护进程不是进程组长
if(fork() != 0)
{
exit(0);
}
//3.调用setsid创建一个会话,让子进程成为守护进程;
// setsid会导致:
// 1).调用进程成为新会话的首进程
// 2).调用进程成为一个进程组的组长进程
// 3).调用进程没有控制终端
setsid();
//4.将当前工作目录更改为根目录
chdir("/");
//5.关闭不需要的文件描述符
close(0); //关闭标准输入
close(1); //关闭标准输出
close(2); //关闭标准错误
//6.忽略SIGCHLD信号
signal(SIGCHLD, SIG_DFL);
}
int main()
{
//将当前进程设置为精灵进程
myDaemon_Init();
//将实际的业务逻辑处理代码放在一个循环中
while(1){
TcpSocket lst_sock;
CHECK_RET(lst_sock.Socket());
CHECK_RET(lst_sock.Bind("172.19.47.151",9000));
CHECK_RET(lst_sock.Listen());
while(1){
TcpSocket con_sock;
lst_sock.Accept(&con_sock);
std::string buf;
lst_sock.Recv(&buf);
std::cout<<"请求信息:["<<buf<<"]"<<std::endl;
std::string first_line="HTTP/1.1 200 OK\r\n";//首行
std::stringstream header;//头部
std::string empty_line="\r\n";//空行
std::string body="<html><body><h2>Enjoy code, enjoy your life!</h2><h1>This is a good day to code!</h1></body></html>";//正文
header<<"Content-Type: text/html\r\n";
header<<"Content-Length: "<<body.size()<<"\r\n";
header<<"Connection: close\r\n";//设置为短连接
//发送首行,头部,空行,正文
con_sock.Send(first_line);
con_sock.Send(header.str());
con_sock.Send(empty_line);
con_sock.Send(body);
con_sock.Close();
}
lst_sock.Close();
}
return 0;
}