#include <stdio.h>
#include <stdlib.h>
#include
<unistd.h>
#include <string.h>
#include
<sys/socket.h>
#include <netinet/in.h>
#include
<arpa/inet.h>
#include <pthread.h>
#include
<sys/types.h>
#include <sys/stat.h>
#include
<fcntl.h>
//线程传参不能传指针,因为服务器的请求砂快,会更新socket描述符的内存
//线程处理网页服务器请求
void *web_handler(void *arg)
{
int client_fd =
(int)arg;
unsigned char buf[1024] = "";
unsigned char filename[50] =
"html/";
recv(client_fd, buf, sizeof(buf), 0);
printf("%s\n",
buf);
sscanf(buf, "GET /%[^ ]", filename +
5); //把文件名从buf中通过sscanf切割出来
printf("filename:%s\n", filename);
if(filename[5] ==
‘\0‘)
{
strcpy(filename, "html/index.html");
}
int fd =
open(filename, O_RDWR);
if(fd < 0)
{
char err_buf[] = "HTTP/1.1
404 Not Found\r\n" \ //错误的报送
"Content-Type:
text/html\r\n" \
"\r\n" \
"<HTML><BODY>File
not found</BODY></HTML>";
send(client_fd, err_buf,
strlen(err_buf), 0);
perror("open");
close(client_fd);
return
NULL;
}
char ok_buf[] = "HTTP/1.1 200
OK\r\n" \ //正确的报备
"Content-Type: text/html\r\n" \
"\r\n";
send(client_fd, ok_buf, strlen(ok_buf), 0);
int len;
while(
(len = read(fd, buf, sizeof(buf))) > 0)
{
send(client_fd, buf, len,
0);
}
close(client_fd);
return NULL;
}
int main(int argc, char *argv[])
{
unsigned short port =
8000;
if(argc > 1)
{
port =
atoi(argv[1]);
}
//socket
int sock_raw_fd = socket(AF_INET,
SOCK_STREAM, 0);
if(sock_raw_fd <
0)
{
perror("socket");
exit(-1);
}
//bind
struct
sockaddr_in server_addr, client_addr;
bzero(&server_addr,
sizeof(server_addr));
server_addr.sin_port =
htons(port);
server_addr.sin_family =
AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int
errlog;
if ( (errlog = bind(sock_raw_fd, (struct sockaddr
*)&server_addr, sizeof(server_addr))) <
0)
{
perror("bind");
close(sock_raw_fd);
exit(-1);
}
//listen
if(
(errlog = listen(sock_raw_fd, 10)) <
0)
{
perror("bind");
close(sock_raw_fd);
exit(-1);
}
while(1)
{
int
conn_fd;
unsigned char cli_addr[INET_ADDRSTRLEN] = "";
int len =
sizeof(client_addr);
if( (conn_fd = accept(sock_raw_fd, (struct sockaddr
*)&client_addr, &len)) >
0) //等待服务器端的请求,并创建子线程为其服务
{
inet_ntop(AF_INET,
&client_addr.sin_addr, cli_addr,
sizeof(cli_addr));
printf("1___port:%d\tip:%s\n",
ntohs(client_addr.sin_port), cli_addr);
pthread_t
tid;
pthread_create(&tid, NULL, web_handler, (void
*)conn_fd);
pthread_detach(tid);
}
}
return 0;
}
坚持每天一个小程序(网络服务器),布布扣,bubuko.com
原文:http://www.cnblogs.com/lsblogs/p/3597697.html