### 网络编程技术实验报告
#### 实验目的
本次网络编程技术实验旨在通过实践操作,使学生深入理解网络编程的基本原理、掌握TCP/IP协议栈的工作机制、熟悉Socket编程接口的使用,以及能够设计和实现简单的网络应用程序,通过亲手编写代码,解决网络通信中的实际问题,提升学生的编程能力和问题解决能力,为后续深入学习计算机网络和分布式系统打下坚实的基础。
#### 实验环境
- **操作系统**:Windows 10 或 Linux(以Ubuntu为例)
- **开发工具**:Visual Studio Code(Windows)/ Vim/Gedit(Linux),GCC或Clang编译器
- **网络库**:标准C/C++库中的Socket API,Python的socket模块(可选)
- **测试工具**:Wireshark(网络抓包工具),telnet/nc(网络测试工具)
#### 实验内容
##### 1. TCP Echo Server与Client的实现
**实验步骤**:
1. **设计TCP Echo Server**:
- 使用Socket API创建一个TCP服务器,监听指定端口(如12345)。
- 等待客户端连接请求,接受连接后,创建一个新的线程或进程来处理客户端的通信。
- 读取客户端发送的数据,并将相同的数据回送给客户端(即Echo功能)。
- 关闭与客户端的连接,并继续监听新的连接请求。
2. **设计TCP Echo Client**:
- 使用Socket API创建一个TCP客户端,连接到服务器的指定端口。
- 向服务器发送一段文本消息。
- 接收服务器回送的消息,并打印到控制台。
- 关闭与服务器的连接。
**代码示例(C语言)**:
**TCP Echo Server**:
```c
#include
#include
#include
#include
#include
#include
#define PORT 12345
void handle_client(int sockfd) {
char buffer[1024];
int n;
while ((n = read(sockfd, buffer, sizeof(buffer) - 1)) > 0) {
buffer[n] = '\0';
write(sockfd, buffer, strlen(buffer));
}
close(sockfd);
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
if (listen(server_fd, 3) < 0) {
perror("listen");
while (1) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 创建新线程或进程处理客户端
// 这里为了简化,直接在当前线程处理
handle_client(new_socket);
return 0;
```
**TCP Echo Client**:
#include
struct sockaddr_in serv_addr;
int sock = 0;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将IPv4和IPv6地址从文本转换成二进制形式
if(inet