开发语言C++,平台为Linux。
主要流程为:服务器获得请求–>响应并处理请求–>返回结果。
这里着重讲怎么处理请求。
主程序在获得一个请求后会开辟一个线程来处理请求
流程图如下。
hand_cgi函数流程图
cgi程序流程图。
代码:
#include"http.h"
int ret = 0;
void printf_log(string s){
//cout << s << endl;
}
int init_fd(int socketi, char* str){
sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(inet_addr(str));
addr.sin_port = htons(PORT);
int err = bind(socketi, (struct sockaddr*)&addr, sizeof(addr));
if (err < 0){
printf_log("bind error");
ret = -1;
}
int on = 0;
setsockopt( socketi, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
err = listen(socketi, 5);
if (err < 0){
printf_log("listen error");
ret = -1;
}
return socketi;
}
static int get_line(int fd, char *buf){
char ch = 0;
char next = 0;
int i = 0;
int err = 0;
while (ch != '\n'){
int size = read(fd, &ch, 1);
if (size <= 0){
ch = '\n';
}
if (ch != '\n' && ch != '\r'){
buf[i++] = ch;
}
else{
if (ch == '\r'){
err = recv(fd, &next, 1, MSG_PEEK);
if (err < 0){
printf_log("recv error");
return -1;
}
if (next == '\n'){
err = read(fd, &ch, 1);
if (err < 0){
printf_log("recv error");
return -1;
}
}//if
ch = '\n';
}
}//else
}//while
buf[i] = 0;
return 1;
}
static void clean_header(int fd){
char ch[100] = {
0};
get_line(fd, ch);
while (strlen(ch) != 0){
get_line(fd, ch);
}
}
static int hand_cgi(int fd, char* path, char * argument){
char line[SIZE/2] = {
0};
char length[10] = {
0};
int i_length =