c++傳輸文件到不同計(jì)算機(jī)上的示例代碼
服務(wù)器端代碼(接收文件)
服務(wù)器端將監(jiān)聽一個(gè)端口,等待客戶端的連接,并接收客戶端發(fā)送的文件。
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
#define BUFFER_SIZE 4096
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
std::ofstream outfile(“received_file”, std::ios::binary);
// 創(chuàng)建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 設(shè)置套接字選項(xiàng)
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
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");
exit(EXIT_FAILURE);
}
// 監(jiān)聽端口
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受客戶端連接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收文件數(shù)據(jù)并寫入文件
int bytes_read;
while ((bytes_read = read(new_socket, buffer, BUFFER_SIZE)) > 0) {
outfile.write(buffer, bytes_read);
}
std::cout << "File received successfully.\n";
// 關(guān)閉套接字和文件
outfile.close();
close(new_socket);
close(server_fd);
return 0;
客戶端代碼(發(fā)送文件)
客戶端將連接到服務(wù)器端的IP地址和端口,并發(fā)送一個(gè)文件。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
#define BUFFER_SIZE 4096
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[BUFFER_SIZE] = {0};
std::ifstream infile(“file_to_send”, std::ios::binary);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "\n Socket creation error \n";
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 將IPv4地址從文本轉(zhuǎn)換為二進(jìn)制形式
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
std::cerr << "\nInvalid address/ Address not supported \n";
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "\nConnection Failed \n";
return -1;
}
// 讀取文件并發(fā)送
while (infile.read(buffer, BUFFER_SIZE)) {
send(sock, buffer, infile.gcount(), 0);
}
// 發(fā)送文件的最后一部分(如果有)
if (infile.gcount() > 0) {
send(sock, buffer, infile.gcount(), 0);
}
std::cout << "File sent successfully.\n";
// 關(guān)閉套接字和文件
infile.close();
close(sock);
return 0;
}注意:
這些示例代碼假設(shè)服務(wù)器和客戶端都在同一網(wǎng)絡(luò)中,并且客戶端知道服務(wù)器的IP地址。
在實(shí)際部署時(shí),你需要將客戶端代碼中的"127.0.0.1"替換為服務(wù)器的實(shí)際IP地址。
這些代碼示例僅用于教學(xué)目的,實(shí)際應(yīng)用中可能需要更多的錯(cuò)誤處理和安全措施
到此這篇關(guān)于c++傳輸文件到不同計(jì)算機(jī)上的示例代碼的文章就介紹到這了,更多相關(guān)c++傳輸文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言算法練習(xí)之求二維數(shù)組最值問題
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中求二維數(shù)組最值的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09
Qt為exe添加ico圖片的簡(jiǎn)單實(shí)現(xiàn)步驟
這篇文章主要給大家介紹了關(guān)于Qt為exe添加ico圖片的簡(jiǎn)單實(shí)現(xiàn)步驟,通過文中介紹的方法可以幫助大家實(shí)現(xiàn)這個(gè)自定義exe圖標(biāo)的效果,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
C++實(shí)現(xiàn)LeetCode(105.由先序和中序遍歷建立二叉樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(105.由先序和中序遍歷建立二叉樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
從c++標(biāo)準(zhǔn)庫(kù)指針萃取器談一下traits技法(推薦)
本篇文章基于gcc中標(biāo)準(zhǔn)庫(kù)源碼剖析一下標(biāo)準(zhǔn)庫(kù)中的模板類pointer_traits,并且以此為例理解一下traits技法,對(duì)c++ traits技法源碼分析感興趣的朋友跟隨小編一起看看吧2021-07-07
C語(yǔ)言正則表達(dá)式詳解 regcomp() regexec() regfree()用法詳解
C語(yǔ)言處理正則表達(dá)式常用的函數(shù)有regcomp()、regexec()、regfree()和regerror(),這里就為大家介紹一下,需要的朋友可以參考一下啊2018-04-04

