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