WebServer(1) 从打造最简单的echo服务器开始征途

本文最后更新于:1 年前

WebServer(1) 从打造最简单的echo服务器开始征途

写在前面

写这篇文章的时候是10月30日,马上就要寒假了,之所以要开这个项目也是为了能赶在投实习前再完成一个网络编程项目。预计在11月完成。自打大三开学之后能明显感觉时间在飞速流走,寒假实习的期限也迫在眉睫,希望自己能顶住压力吧。需要说明的是,因为自己时间太紧,本项目完全是跟着csdn上面大佬的流程进行的,不过也是逐行代码自己琢磨研究过了,等稳定后再重新翻阅。

正文

在上代码之前,先上一张流程图:

图为TCP报文交互

simple echo server 0.01

上源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int argc,char* argv[]) // argc是命令行中参数数量,argv是命令行中参数的数组(第一个元素是程序名)
{
// 参数数量小于3退出
if (argc <= 2)
{
printf( "Usage: %s ip_address portname\n", argv[0] );
return 0;
}

const char* ip = argv[1]; // ip地址
int port = atoi( argv[2] ); // 端口号
int listenfd = socket( PF_INET, SOCK_STREAM, 0 ); // 创建TCP套接字
// 协议族 协议类型 协议编号
assert( listenfd >= 1 ); // 套接字文件描述符小于1,报错

// 创建sockaddr_in结构体,处理网络通信
struct sockaddr_in address;
memset( &address, 0, sizeof( address ) ); // 初始化address
address.sin_family = AF_INET; // 协议族
address.sin_port = htons( port ); // 端口号 修改字节序后存储进struct
inet_pton( AF_INET, ip, &address.sin_addr ); // 主机地址 以二进制形式存储进struct

int ret = 0;
ret = bind( listenfd, (struct sockaddr*)( &address ), sizeof( address ) ); // 把本地协议地址赋予套接字
assert( ret != -1 ); // 返回值等于-1,报错

ret = listen( listenfd, 5 ); // 把进程变为服务器
assert( ret != -1 ); // 返回值等于-1,报错

// 创建客户端
struct sockaddr_in client;
socklen_t client_addrlength = sizeof( client );
int sockfd = accept( listenfd, (struct sockaddr*)( &address ), &client_addrlength );

char buf_size[1024] = {0};
int recv_size = 0;
recv_size = recv( sockfd, buf_size, sizeof( buf_size ) , 0); // 向客户端套接字sockfd发送内容
// 发送数据的首地址是buf_size
// 返回内容长度
int send_size = 0;
send_size = send( sockfd, buf_size , recv_size , 0 ); // 向客户端套接字sockfd发送内容
// 发送数据的首地址是buf_size
// 返回内容长度

close( sockfd );
close( listenfd );

return 0;
}

注释已经添加了,接下来验证一下。

先用gcc编译生成可执行文件:

图为WebServer文件夹页面

运行该可执行文件,参数为回流的本地地址和端口号:

图为命令行页面

同时再启动一个终端页面,利用nc冒充客户端验证该服务器:

图为命令行页面

能看到输入完信息后是可以回弹的,验证成功!