# Socket Lab **Repository Path**: kkkyyzz/socket-lab ## Basic Information - **Project Name**: Socket Lab - **Description**: TJU Computer Network course socket lab - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2024-05-15 - **Last Updated**: 2026-04-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Socket Lab ## 介绍 TJU Computer Network course socket lab ### 基础代码目录说明 1. 网络客户端和服务器代码 .../echo_client.c - 简单的回声网络客户端。这个程序负责向服务器发送数据,并接收服务器返回的相同数据。 .../echo_server.c - 简单的回声网络服务器。它监听来自客户端的连接请求,接收客户端发送的数据,并将相同的数据回传给客户端。 2. 编译规则文件 .../Makefile - 包含用于构建项目的make规则。这个文件定义了如何编译和链接客户端和服务器程序,以及如何清理编译生成的文件。 3. 示例驱动和解析器代码 .../example.c - 示例驱动程序,用于演示如何调用和使用解析器。 .../lexer.l - 包含Lex/Yacc相关的逻辑,用于词法分析。 .../parse.y - Yacc文件,用于定义语法分析的规则。 .../parse.c - 生成的解析器代码,通常由Yacc工具从parse.y文件自动生成。 .../parse.h - 解析器的头文件,包含了解析器函数和数据结构的声明,供其他程序模块调用。 4. 示例HTTP请求 .../sample_request_simple - 包含简单的HTTP请求示例。这可以用来测试网络程序处理HTTP请求的能力。 .../sample_request_realistic - 包含更为真实的HTTP请求示例。这些示例更加复杂,可能包含多种HTTP头部和更长的请求体 ### 项目要求 #### 第一周要求: 1. 搭建编程环境 2. 学习分词方法lex和yacc 3. 实现简单的echo web server: Server收到client的带多请求行的消息后,能够正确解析出来,并且返回响应消息(response message)。分以下3种情况处理: >1. Echo: 如果收到客户端发来的是GET, HEAD和POST方法,则echo回去,即重新封装(encapsulation)消息并返回给客户端。 >2. 没实现:如果收到客户端发来的是除GET, HEAD和POST以外的其它方法,服务器并没有实现,则需要返回响应消息“HTTP/1.1 501 Not Implemented\r\n\r\n”。 >3. 格式错误:如果收到的客户端消息的格式错误,应能够识别出来,并返回错误代码为400的HTTP响应消息“HTTP/1.1 400 Bad request\r\n\r\n”。 #### 第二周要求: 1. 完善服务器的功能,使其能够正确响应HTTP1.1请求消息,并按照RFC 2616中的定义实现HEAD、GET和POST的持久连接(persistent connection),具体要求如下: >1. 如果收到客户端发来的GET, HEAD和POST方法,服务器按照RFC2616的规定进行处理并响应消息。 >2. 支持4种HTTP 1.1 出错代码:400,404,501,505。能够准确判别客户端消息,并响应消息。 >3. 妥善管理接收缓冲区,避免由于客户端请求消息太长导致的缓冲区溢出问题。 2. 服务器能够处理读写磁盘文件时遇到的错误(例如,权限、文件不存在、IO错误等); 3. 创建简化的日志记录模块,记录格式化日志; 4. 不需要实现分块(Chunking); 5. 不需要实现 Conditional GETs; 6. 响应的要求: >1. 对GET/HEAD两种请求发回的响应必须包含"HTTP/1.1 200 OK\r\n"。 >2. GET方法获取的网页使用基础代码提供的默认网页,网页位于“static_site/index.html”。 >3. 400、404、501、505的响应内容为: >>- RESPONSE_400 = “HTTP/1.1 400 Bad request\r\n\r\n”; >>- RESPONSE_404 = “HTTP/1.1 404 Not Found\r\n\r\n”; >>- RESPONSE_501 = “HTTP/1.1 501 Not Implemented\r\n\r\n”; >>- RESPONSE_505 = “HTTP/1.1 505 HTTP Version not supported\r\n\r\n”; #### 第三周要求: 1. 服务器能连续响应客户端使用同一个 TCP 连接同时发送的多个请求GET/HEAD/POST,即支持 HTTP pipelining。 2. 服务器按照 RFC2616 规定的顺序处理 HTTP 的并发请求。 3. 对于 HTTP 的并发请求,如果服务器认为其中一个请求是错误的并拒绝该请求,那么服务器需要能够正确识别并解析出并发到达的下一条请求。 #### 第四周要求 - 当服务器在等待一个客户端发送下一个请求时,能够同时处理来自其它客户端的请求,使服务器能够同时处理多个并发的客户端。 >1. 将服务器能够支持的最大连接数设置为 1024,这是操作系统可用文件描述符数量的最大值。 >2. 客户端可能会“暂停”(即请求发送了一半突然暂停)或出错,但这些问题不应对其他并发用户产生不良影响。也就是说,如果一个客户端只发送了请求 的一半就停止了,那么服务端应继续为另一个客户端提供服务。 >3. 只能通过 select()方法实现并发, 禁止使用多线程。 ### 时间节点 - 5月15日:项目启动 - 5月26日: 提交第1周进度报告。 - 6月2日:提交第2周进度报告。 - 6月9日:提交第3周进度报告。 - 6月16日:提交第4周进度报告。 - 6月23日: 提交实验报告和最终源码。 ### TODO List * 第一周 >1. 修改echo_server.c:接收到消息后需并解析后需按要求响应(done) >2. 修改echo_client.c:将输入参数修改为文件形式(done) >3. 修改parse.c、parse.y:能够利用lex和yacc正确解析消息(done) * 第二周 >1. 修改echo_server.c:正确实现4xx,5xx错误相应,能够正确相应GET HEAD POST三种请求(done) >2. 管理接收缓冲区,服务器能够处理读写磁盘文件时遇到的错误(例如,权限、文件不存在、IO错误等)(done) >3. 创建简化的日志记录模块,记录格式化日志 * 第三周 >1. 修改echo_server.c:能够对同一个客户端发送的多个请求进行正确分割(done) >2. 能够正确对分割后的请求进行pipeline处理并按顺序返回给客户端(done) * 第四周 >1. 修改echo_server.c:使用select函数使服务器能够同时处理多个并发的客户端连接(done) >2. 使用 Apache bench,设置不同数量级的并发数量,对第三周实现的服务器(不支持并发客户端)和第四周实现的服务器(支持并发客户端),进行对比测试 ### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request