学完了《TCP/IP网络编程》和《linux高性能服务器编程》,准备从头开始写一个webserver服务器来复习加深所学的一些网络编程的知识(虽然是个烂大街的项目但对于学习网络编程还是有很大的好处的,本人打算实现web之后再找其它有难度的项目实现)。
## 设计思路
先实现一个简单的echo服务器也就是服务器里的“Hello world”,然后再添加epoll IO多路复用,编写多个头文件,定义多个类来实现信息的不断接受和打印,再实现简单的http服务器接受网页发来的GET请求并传递一个简单的html文本,然后再实现分析请求。
对于web的其它功能例如时间轮,日志,链接数据库等等,等我学完了我会在其它博客中实现哈哈(本人目前还只学到分析网页发来的请求)。
下面是一个简单的echo服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main()//方便测试未使用命令行参数
{
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;
char message[1024];
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
if(serv_sock == -1)
printf("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//采用本机的IP地址
serv_addr.sin_port=htons(atoi("9190"));//端口号为9190
if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 )
printf("bind() error");
if(listen(serv_sock, 5)==-1)
printf("listen() error");
clnt_addr_size=sizeof(clnt_addr);
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
if(clnt_sock==-1)
printf("accept() error");
//以上都是建立服务端与客户端连接的代码编写
memset(&message,'\0',sizeof(message));//如果不将字符串全部置为空,打印的时候终端会多打印一个小问号字符(目前还不清楚为什么)
recv(clnt_sock, message, sizeof(message),0);//接受来自客户端的消息
printf("%s\n",message);
close(clnt_sock);
close(serv_sock);
return 0;
}
开启虚拟机,打开终端,生成可执行文件s,再开启另一个终端,使用nc命令连接本机端口,发送“hello world”,可以看到在另一个终端printf客户端发来的信息
欢迎各路大佬指正建议!