出處:
基礎的基於socket進行傳輸關鍵在於控制,需要自己行分包和組包。
原理很簡單那,我們就直接看一下**吧。
**引用自:
// file_server.c -- socket檔案傳輸伺服器端示例**
// /
#include#include#include#include#include#include#define hello_world_server_port 6666
#define length_of_listen_queue 20
#define buffer_size 1024
#define file_name_max_size 512
int main(int argc, char **argv)
// 把socket和socket位址結構繫結
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
// server_socket用於監聽
if (listen(server_socket, length_of_listen_queue))
// 伺服器端一直執行用以持續為客戶端提供服務
while(1)
char buffer[buffer_size];
bzero(buffer, sizeof(buffer));
length = recv(new_server_socket, buffer, buffer_size, 0);
if (length < 0)
char file_name[file_name_max_size + 1];
bzero(file_name, sizeof(file_name));
strncpy(file_name, buffer,
strlen(buffer) > file_name_max_size ? file_name_max_size : strlen(buffer));
file *fp = fopen(file_name, "r");
if (fp == null)
else
bzero(buffer, sizeof(buffer));
} fclose(fp);
printf("file:\t%s transfer finished!\n", file_name);
} close(new_server_socket);
} close(server_socket);
return 0;
}
//
// file_client.c socket傳輸檔案的client端示例程式
// ///
#include// for sockaddr_in
#include// for socket
#include// for socket
#include// for printf
#include// for exit
#include// for bzero
#define hello_world_server_port 6666
#define buffer_size 1024
#define file_name_max_size 512
int main(int argc, char **argv)
// 設定乙個socket位址結構client_addr, 代表客戶機的internet位址和埠
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
client_addr.sin_family = af_inet; // internet協議族
client_addr.sin_addr.s_addr = htons(inaddr_any); // inaddr_any表示自動獲取本機位址
client_addr.sin_port = htons(0); // auto allocated, 讓系統自動分配乙個空閒埠
// 建立用於internet的流協議(tcp)型別socket,用client_socket代表客戶端socket
int client_socket = socket(af_inet, sock_stream, 0);
if (client_socket < 0)
// 把客戶端的socket和客戶端的socket位址結構繫結
if (bind(client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr)))
// 設定乙個socket位址結構server_addr,代表伺服器的internet位址和埠
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = af_inet;
// 伺服器的ip位址來自程式的引數
if (inet_aton(argv[1], &server_addr.sin_addr) == 0)
server_addr.sin_port = htons(hello_world_server_port);
socklen_t server_addr_length = sizeof(server_addr);
// 向伺服器發起連線請求,連線成功後client_socket代表客戶端和伺服器端的乙個socket連線
if (connect(client_socket, (struct sockaddr*)&server_addr, server_addr_length) < 0)
char file_name[file_name_max_size + 1];
bzero(file_name, sizeof(file_name));
printf("please input file name on server.\t");
scanf("%s", file_name);
char buffer[buffer_size];
bzero(buffer, sizeof(buffer));
strncpy(buffer, file_name, strlen(file_name) > buffer_size ? buffer_size : strlen(file_name));
// 向伺服器傳送buffer中的資料,此時buffer中存放的是客戶端需要接收的檔案的名字
send(client_socket, buffer, buffer_size, 0);
file *fp = fopen(file_name, "w");
if (fp == null)
// 從伺服器端接收資料到buffer中
bzero(buffer, sizeof(buffer));
int length = 0;
while(length = recv(client_socket, buffer, buffer_size, 0))
int write_length = fwrite(buffer, sizeof(char), length, fp);
if (write_length < length)
bzero(buffer, buffer_size);
} printf("recieve file:\t %s from server[%s] finished!\n", file_name, argv[1]);
// 傳輸完畢,關閉socket
fclose(fp);
close(client_socket);
return 0;
}
Linux傳輸大檔案(分割傳輸)
1.分拆為多個檔案的命令 cat workspace 2018.tar.gz split b 1g workspace 2018.tar.gz.命令解釋 拆分成1g的小檔案 workspace 2018.tar.gz.是拆分後檔案的字首,預設分拆後檔名稱為workspace 2018.tar.gz....
C TcpClient網路程式設計傳輸檔案
c tcpclient網路程式設計傳輸檔案 帶檔名 參照 c tcpclient網路程式設計傳輸檔案 帶檔名 一 簡述 利用c tcpclient在區域網內傳輸檔案,可是檔案傳送到對面的時候卻要重新命名檔案的。那可不可以連著檔名與檔案一起發過去呢?二 內容 如上圖,把檔名字元流的長度的值的字元流 這...
用 VC socket 傳輸大檔案
在這個程式中,客戶端讀取桌面的乙個 1.48 gb 1,597,701,030 位元組 的rar檔案傳送給伺服器。因為這裡僅用於學習,所以客戶端要連線的目標位址使用127.0.0.1。伺服器端接將收的檔案檔案儲存在c盤根目錄下。為保證程式的可靠傳送,程式採用tcp協議。經過反覆試驗得出結論,程式中的...