服務端向客戶端傳輸檔案

2021-10-02 08:01:49 字數 4525 閱讀 1983

23.1 閱讀須知

所以如果不符合你的需求就不用往下了。

//這是用socket傳輸檔案的服務端

#include

// sockaddr_in

#include

// socket

#include

// socket

#include

// printf

#include

// exit

#include

// bzero

#define server_port 8000

#define length_of_listen_queue 20

#define buffer_size 1024

#define file_name_max_size 512

intmain

(void

)int opt =1;

setsockopt

(server_socket_fd, sol_socket, so_reuseaddr,

&opt,

sizeof

(opt));

// 繫結socket和socket位址結構 if(

-1==(

bind

(server_socket_fd,

(struct sockaddr*

)&server_addr,

sizeof

(server_addr)))

)// socket監聽 if(

-1==(

listen

(server_socket_fd, length_of_listen_queue)))

while(1

)// recv函式接收資料到緩衝區buffer中

char buffer[buffer_size]

;bzero

(buffer, buffer_size);if

(recv

(new_server_socket_fd, buffer, buffer_size,0)

<0)

// 然後從buffer(緩衝區)拷貝到file_name中

char file_name[file_name_max_size+1]

;bzero

(file_name, file_name_max_size+1)

;strncpy

(file_name, buffer,

strlen

(buffer)

>file_name_max_size?file_name_max_size:

strlen

(buffer));

printf

("%s\n"

, file_name)

;// 開啟檔案並讀取檔案資料

file *fp =

fopen

(file_name,

"r");if

(null

== fp)

else

bzero

(buffer, buffer_size);}

// 關閉檔案

fclose

(fp)

;printf

("file:%s transfer successful!\n"

, file_name);}

// 關閉與客戶端的連線

close

(new_server_socket_fd);}

// 關閉監聽用的socket

close

(server_socket_fd)

;return0;

}

//這是用socket傳輸檔案的客戶端栗子

#include

// sockaddr_in

#include

// socket

#include

// socket

#include

// printf

#include

// exit

#include

// bzero

#define server_port 8000

#define buffer_size 1024

#define file_name_max_size 512

intmain()

// 繫結客戶端的socket和客戶端的socket位址結構 非必需 if(

-1==(

bind

(client_socket_fd,

(struct sockaddr*

)&client_addr,

sizeof

(client_addr)))

)// 宣告乙個伺服器端的socket位址結構,並用伺服器那邊的ip位址及埠對其進行初始化,用於後面的連線

struct sockaddr_in server_addr;

bzero

(&server_addr,

sizeof

(server_addr)

);

server_addr.sin_family = af_inet;if(

inet_pton

(af_inet,

"127.0.0.1"

,&server_addr.sin_addr)==0

)

server_addr.sin_port =

htons

(server_port)

;

socklen_t server_addr_length =

sizeof

(server_addr)

;// 向伺服器發起連線,連線成功後client_socket_fd代表了客戶端和伺服器的乙個socket連線 if(

connect

(client_socket_fd,

(struct sockaddr*

)&server_addr, server_addr_length)

<0)

// 輸入檔名 並放到緩衝區buffer中等待傳送

char file_name[file_name_max_size+1]

;bzero

(file_name, file_name_max_size+1)

;printf

("please input file name on server:\t");

scanf

("%s"

, file_name)

;char buffer[buffer_size]

;bzero

(buffer, buffer_size)

;strncpy

(buffer, file_name,

strlen

(file_name)

>buffer_size?buffer_size:

strlen

(file_name));

// 向伺服器傳送buffer中的資料 if(

send

(client_socket_fd, buffer, buffer_size,0)

<0)

// 開啟檔案,準備寫入

file *fp =

fopen

(file_name,

"w");if

(null

== fp)

// 從伺服器接收資料到buffer中

// 每接收一段資料,便將其寫入檔案中,迴圈直到檔案接收完並寫完為止

bzero

(buffer, buffer_size)

;int length =0;

while

((length =

recv

(client_socket_fd, buffer, buffer_size,0)

)>0)

bzero

(buffer, buffer_size);}

// 接收成功後,關閉檔案,關閉socket

printf

("receive file:\t%s from server ip successful!\n"

, file_name)

;close

(fp)

;close

(client_socket_fd)

;return0;

}

23.3 測試情況

1、先執行伺服器**,然後再執行客戶端。沒有伺服器客戶端準備連**去?

2、傳送可執行檔案的話是無法執行的,可以把**傳過去然後自己再編譯一遍,這個是允許的。

3、如果接收到的檔案出現異常,先檢查伺服器裡面的檔案,可能那個檔案本來就不正常呀,不是傳輸的問題。

4、目前測試過有txt, c,c++,h等檔案

服務端客戶端的檔案流式傳輸

服務端客戶端的檔案流式傳輸 在研究webservice的時候,發現檔案流式的傳輸是基於socket的傳輸。大致的流程是 服務端客戶端的通訊 針對內容進行stream的讀取,並將資料放到buffer中 處理通訊請求 另一接收端 針對傳輸過來的內容進行讀取,用乙個新的byte陣列將內容存入。下面是針對這...

Python UDP客戶端 服務端

udpclient.py coding utf 8 from socket import servername 127.0.0.1 伺服器位址,本例中使用一台遠端主機 serverport 12000 伺服器指定的埠 clientsocket socket af inet,sock dgram 建立...

python udp客戶端,服務端

客戶端1 建立套接字 2 收發資料 3 關閉套接字 import socket 建立套接字 socket socket.socket socket.af inet,socket.sock dgram 傳送資料 傳送資料的型別必須是位元組型別 data 你猜 encode gbk addr 192.1...