我们使用C语言实现简单的web服务器功能,当有请求到来时,我们返回Http报文数据。
使用socket来监听端口,并发送数据。
源码如下 web.c:#include
#include
#include // socket
#include // 基本数据类型
#include // read write
#include
#include
#include // open close
#include
#include
#define PORT 8888
#define SERV "0.0.0.0"
#define QUEUE 20
#define BUFF_SIZE 1024
typedef struct doc_type{
char *key;
char *value;
}HTTP_CONTENT_TYPE;
HTTP_CONTENT_TYPE http_content_type[] = {
{ "html","text/html" },
{ "gif" ,"image/gif" },
{ "jpeg","image/jpeg" }
};
int sockfd;
char *http_res_tmpl = "HTTP/1.1 200 OK\r\n"
"Server: Cleey's Server V1.0\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: %d\r\n"
"Connection: close\r\n"
"Content-Type: %s\r\n\r\n";
void handle_signal(int sign); // 退出信号处理
void http_send(int sock,char *content); // http 发送相应报文
int main(){
signal(SIGINT,handle_signal);
int count = 0; // 计数
// 定义 socket
sockfd = socket(AF_INET,SOCK_STREAM,0);
// 定义 sockaddr_in
struct sockaddr_in skaddr;
skaddr.sin_family = AF_INET; // ipv4
skaddr.sin_port = htons(PORT);
skaddr.sin_addr.s_addr = inet_addr(SERV);
// bind,绑定 socket 和 sockaddr_in
if( bind(sockfd,(struct sockaddr *)&skaddr,sizeof(skaddr)) == -1 ){
perror("bind error");
exit(1);
}
// listen,开始添加端口
if( listen(sockfd,QUEUE) == -1 ){
perror("listen error");
exit(1);
}
// 客户端信息
char buff[BUFF_SIZE];
struct sockaddr_in claddr;
socklen_t length = sizeof(claddr);
while(1){
int sock_client = accept(sockfd,(struct sockaddr *)&claddr, &length);
printf("%d\n",++count);
if( sock_client <0 ){
perror("accept error");
exit(1);
}
memset(buff,0,sizeof(buff));
int len = recv(sock_client,buff,sizeof(buff),0);
fputs(buff,stdout);
//send(sock_client,buff,len,0);
http_send(sock_client,"Hello World!");
close(sock_client);
}
fputs("Bye Cleey",stdout);
close(sockfd);
return 0;
}
void http_send(int sock_client,char *content){
char HTTP_HEADER[BUFF_SIZE],HTTP_INFO[BUFF_SIZE];
int len = strlen(content);
sprintf(HTTP_HEADER,http_res_tmpl,len,"text/html");
len = sprintf(HTTP_INFO,"%s%s",HTTP_HEADER,content);
send(sock_client,HTTP_INFO,len,0);
}
void handle_signal(int sign){
fputs("\nSIGNAL INTERRUPT \nBye Cleey! \nSAFE EXIT\n",stdout);
close(sockfd);
exit(0);
}
编译启动web服务器:gcc web.c -o web && ./web
在网页上输入:ip 加 端口就能获取数据了http://192.168.1.12:8888