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...