用udp和tcp知识写一个文件传输用c++
以下是一个使用UDP和TCP进行文件传输的C++示例代码:
使用UDP进行文件传输:
// UDP 文件传输 - 发送端
#include <iostream>
#include <fstream>
#include <cstring>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
int main()
{
std::string filename = "file.txt";
std::string serverIP = "127.0.0.1";
int serverPort = 12345;
// 打开文件
std::ifstream file(filename, std::ios::binary);
if (!file)
{
std::cerr << "无法打开文件" << std::endl;
return 1;
}
// 创建 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
std::cerr << "无法创建套接字" << std::endl;
return 1;
}
// 设置服务器地址和端口
struct sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
inet_pton(AF_INET, serverIP.c_str(), &(serverAddr.sin_addr));
// 发送文件内容
char buffer[MAX_BUFFER_SIZE];
while (file)
{
file.read(buffer, MAX_BUFFER_SIZE);
ssize_t bytesRead = file.gcount();
ssize_t bytesSent = sendto(sockfd, buffer, bytesRead, 0, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (bytesSent < 0)
{
std::cerr << "发送数据失败" << std::endl;
break;
}
}
// 关闭套接字和文件
close(sockfd);
file.close();
return 0;
}
// UDP 文件传输 - 接收端
#include <iostream>
#include <fstream>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
int main()
{
std::string filename = "received_file.txt";
int port = 12345;
// 创建 UDP 套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
std::cerr << "无法创建套接字" << std::endl;
return 1;
}
// 绑定本地地址和端口
struct sockaddr_in localAddr{};
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0)
{
std::cerr << "绑定地址和端口失败" << std::endl;
return 1;
}
// 打开文件
std::ofstream file(filename, std::ios::binary);
if (!file)
{
std::cerr << "无法创建文件" << std::endl;
return 1;
}
// 接收文件内容
char buffer[MAX_BUFFER_SIZE];
ssize_t bytesRead;
while ((bytesRead = recvfrom(sockfd, buffer, sizeof(buffer), 0, nullptr, nullptr)) > 0)
{
file.write(buffer, bytesRead);
}
// 关闭套接字和文件
close(sockfd);
file.close();
return 0;
}
使用TCP进行文件传输:
// TCP 文件传输 - 服务器端
#include <iostream>
#include <fstream>
#include <cstring>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
int main()
{
std::string filename = "file.txt";
int port = 12345;
// 打开文件
std::ifstream file(filename, std::ios::binary);
if (!file)
{
std::cerr << "无法打开文件" << std::endl;
return 1;
}
// 创建 TCP 套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
std::cerr << "无法创建套接字" << std::endl;
return 1;
}
// 设置服务器地址和端口
struct sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(port);
// 绑定地址和端口
if (bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
std::cerr << "绑定地址和端口失败" << std::endl;
return 1;
}
// 监听连接
if (listen(sockfd, 1) < 0)
{
std::cerr << "监听连接失败" << std::endl;
return 1;
}
// 等待客户端连接
struct sockaddr_in clientAddr{};
socklen_t clientAddrLen = sizeof(clientAddr);
int clientSockfd = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrLen);
if (clientSockfd < 0)
{
std::cerr << "接受客户端连接失败" << std::endl;
return 1;
}
// 发送文件内容
char buffer[MAX_BUFFER_SIZE];
while (file)
{
file.read(buffer, MAX_BUFFER_SIZE);
ssize_t bytesRead = file.gcount();
ssize_t bytesSent = send(clientSockfd, buffer, bytesRead, 0);
if (bytesSent < 0)
{
std::cerr << "发送数据失败" << std::endl;
break;
}
}
// 关闭套接字和文件
close(clientSockfd);
close(sockfd);
file.close();
return 0;
}
// TCP 文件传输 - 客户端
#include <iostream>
#include <fstream>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
int main()
{
std::string filename = "received_file.txt";
std::string serverIP = "127.0.0.1";
int serverPort = 12345;
// 创建 TCP 套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
std::cerr << "无法创建套接字" << std::endl;
return 1;
}
// 设置服务器地址和端口
struct sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
inet_pton(AF_INET, serverIP.c_str(), &(serverAddr.sin_addr));
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
std::cerr << "无法连接服务器" << std::endl;
return 1;
}
// 打开文件
std::ofstream file(filename, std::ios::binary);
if (!file)
{
std::cerr << "无法创建文件" << std::endl;
return 1;
}
// 接收文件内容
char buffer[MAX_BUFFER_SIZE];
ssize_t bytesRead;
while ((bytesRead = recv(sockfd, buffer, sizeof(buffer), 0)) > 0)
{
file.write(buffer, bytesRead);
}
// 关闭套接字和文件
close(sockfd);
file.close();
return 0;
}
以上代码示例了如何使用UDP和TCP进行文件传输。UDP示例中,发送方将文件内容分段发送给接收方,接收方将接收到的数据写入文件。TCP示例中,服务器端先监听连接,客户端连接上服务器后,服务器将文件内容发送给客户端,客户端接收数据并将其写入文件。这些示例代码只是基本实现,不包含错误处理和完整性验证,实际使用时需要增加相关的代码
原文地址: https://www.cveoy.top/t/topic/iyGo 著作权归作者所有。请勿转载和采集!