网络编程技术实验报告

admin 2 0

### 网络编程技术实验报告

#### 实验目的

本次网络编程技术实验旨在通过实践操作,使学生深入理解网络编程的基本原理、掌握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