- 论坛徽章:
- 0
|
int khttp_process()
{
char log_buffer[LOG_BUFFER];
int listen_pid = getpid();
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(LISTEN_PORT);
memset(&server_address.sin_zero, 0, sizeof(server_address.sin_zero));
setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr));
bind(server_socket, (struct sockaddr*) &server_address, sizeof(struct sockaddr_in));
int listen_status = listen(server_socket, BACK_LOG);
if (listen_status == -1)
{
klog(KLOG_ERROR, "侦听失败。");
return -1;
}
else
{
sprintf(log_buffer, "一切就绪(PID:%d),开始侦听请求...", listen_pid);
klog(KLOG_INFO, log_buffer);
}
/*
* 开始等待请求,请求将通过fork()让子进程处理。
*/
struct sockaddr_in client_address;
socklen_t client_address_size = (socklen_t) sizeof(client_address);
int client_socket;
int client_pid;
while (1)
{
client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_size);
signal(SIGCHLD, SIG_IGN);
fork();
client_pid = getpid();
if (client_pid != listen_pid)
{
int exit_result = 0;
struct http_request request;
int request_result;
struct http_response response;
int response_result;
sprintf(log_buffer, "子进程(PID:%d)已启动,开始处理请求...", client_pid);
klog(KLOG_TRACE, log_buffer);
request.headers = (struct http_header**) malloc(sizeof(struct http_header) * HEADER_COUNT);
//request_result = parse_request(client_socket, &request);
if (request_result == -1)
{
exit_result = -1;
sprintf(log_buffer, "子进程(PID:%d)无法解析请求:%s。", client_pid,request.uri);
klog(KLOG_ERROR, log_buffer);
}
else
{
}
shutdown(client_socket, SHUT_RDWR);
close(client_socket);
sprintf(log_buffer, "子进程(PID:%d)退出,退出代码是%d。", client_pid, exit_result);
klog(KLOG_TRACE, log_buffer);
fork_exit:
free(log_buffer);
// 子进程处理完后,不要再进行任何操作,直接退出。
exit(exit_result);
}
}
close(server_socket);
return 0;
}
[ 本帖最后由 freedomch2 于 2009-4-28 16:56 编辑 ] |
|