首页 > 其他 > 详细

坚持每天一个小程序(网络服务器)

时间:2014-03-13 11:35:22      阅读:461      评论:0      收藏:0      [点我收藏+]

#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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!