、IPv4 环境下的 UDP 套接字应用程序开发 (1)创建服务端和客户端,选择一个通信端口,用 C++/C 语言编程实现通信演示程序; (2)要求包含文件的基本操作,例如打开和读写操作。 (3)要求发送方从文件读取内容并传输;接收方收到内容后,保存在文件中。 (4)服务器端和客户端程序分别部署在虚拟机网络环境中,Wireshark 完成抓包和报文分 析。 (5)测试时,应考虑传输不同大小文件的情况。
时间: 2024-03-02 13:50:34 浏览: 87
以下是基于IPv4环境下的UDP套接字应用程序开发的代码示例:
服务端代码:
```c++
#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
using namespace std;
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len = sizeof(client_addr);
char buffer[MAX_BUFFER_SIZE];
// 创建服务端套接字
if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket create failed");
exit(EXIT_FAILURE);
}
// 绑定服务端地址和端口号
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) {
perror("bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 接收客户端发送的数据并保存到文件
ofstream out_file("server_receive.txt", ios::binary);
if (!out_file.is_open()) {
perror("file open failed");
close(server_fd);
exit(EXIT_FAILURE);
}
ssize_t recv_size;
while ((recv_size = recvfrom(server_fd, buffer, MAX_BUFFER_SIZE, 0,
(struct sockaddr *) &client_addr, &client_addr_len)) > 0) {
out_file.write(buffer, recv_size);
}
out_file.close();
close(server_fd);
return 0;
}
```
客户端代码:
```c++
#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERVER_ADDR "127.0.0.1"
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
using namespace std;
int main() {
int client_fd;
struct sockaddr_in server_addr;
char buffer[MAX_BUFFER_SIZE];
// 创建客户端套接字
if ((client_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket create failed");
exit(EXIT_FAILURE);
}
// 设置服务端地址和端口号
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
server_addr.sin_port = htons(PORT);
// 从文件读取内容并发送到服务端
ifstream in_file("client_send.txt", ios::binary);
if (!in_file.is_open()) {
perror("file open failed");
close(client_fd);
exit(EXIT_FAILURE);
}
streampos file_size;
in_file.seekg(0, ios::end);
file_size = in_file.tellg();
in_file.seekg(0, ios::beg);
ssize_t send_size, total_send_size = 0;
while (total_send_size < file_size) {
in_file.read(buffer, MAX_BUFFER_SIZE);
send_size = sendto(client_fd, buffer, in_file.gcount(), 0,
(struct sockaddr *) &server_addr, sizeof(server_addr));
if (send_size == -1) {
perror("sendto failed");
in_file.close();
close(client_fd);
exit(EXIT_FAILURE);
}
total_send_size += send_size;
}
in_file.close();
close(client_fd);
return 0;
}
```
在运行服务端和客户端程序前,需要将要传输的文件命名为"client_send.txt"并放置在程序所在目录下。
运行服务端程序后,再运行客户端程序,即可完成文件的传输。传输完成后,服务端会将接收到的数据保存在名为"server_receive.txt"的文件中。
关于Wireshark的抓包和报文分析,可以在虚拟机网络环境中运行Wireshark软件进行操作。
需要注意的是,在测试时应该考虑传输不同大小的文件,以验证程序的稳定性和效率。
阅读全文