TCP IP程式設計實現遠端檔案傳輸

2022-04-04 22:00:13 字數 2612 閱讀 4778

tcp/ip程式設計實現遠端檔案傳輸在lunix中一般都採用套接字(socket)系統呼叫。

採用客戶/伺服器模式,其程式編寫步驟如下:

#include >sys/types.h>

#include >sys/socket.h>

int socket(int family,int type,int protocol)

其中:(1)family指明套節字族,其值包括:  

af_unix   (unix內部協議族) 

af_inet   (iternet協議)

af_ns (xeroxns協議,tcp/ip程式設計取該值)

af_implink  (imp鏈結層)

(2)type 指明套接字型別,取值有:

sock_stream    (流套接字) 

sock_dgram    (資料報套接字)

sock_raw     (原始套接字)

sock_seqpacket   (定序分組套接字)

一般情況下,前兩個引數的組合就可以決定所使用的協議,這時第三個引數被置為0,如果第乙個引數為af_inet,第二個引數選sock_stream,則使用的協議為tcp;第二個引數選sock_dgram,則使用的協議為udp;當第二個引數選sock_raw時,使用的協議為ip。值得指出的是並不是所有的族和型別的組合都是合法的,具體請查閱相關資料。該系統呼叫若成功則返回乙個類似檔案描述符,成為套節字描述字,可以像檔案描述符那樣用read和write對其進行i/o操作。當乙個程序使用完該軟插座時,需用close(《描述符》)關閉(具體見後面內容)。

#include #include int bind(int socketfd,struct sockaddr_in *localaddr,sizeof(localaddr));
struct sockaddr_in
一台機器上的每個網路程式使用乙個各自獨立的埠號碼,例如:telnet程式使用埠號23,而ftp檔案傳輸程式使用埠號21。我們在設計應用程式時,埠號碼可以由getservbyname()函式從/etc/services庫檔案中獲取,也可以由htons (int portnum)函式將任意正整數轉換為網路位元組次序形式來得到,有些版本的unix作業系統則規定1024以下的埠號碼只可被超級使用者使用,普通使用者程式使用的埠號碼只限於1025到32767之間。網路位址可以由gethostbyname(char*hostname)函式得到(該函式和getservbyname()一樣都以網路位元組次序形式返回所有在他們結構中的資料),引數hostname為/etc/hosts檔案中某一網路位址所對應的機器名。該函式返回乙個型別為hostent的結構指標,hostent結構在netdb.h中定義:  

struct hostent
(3)第三個引數為第二個結構引數的長度,如果呼叫成功,bind返回0,否則將返回-1並設定errno。

格式:int listen(int socketfd,int backlong)

它通常在socket和bind呼叫後在accept呼叫前執行。第二個引數指明在等待伺服器執行accept呼叫時系統可以排隊多少個連線要求。此引數常指定為5,也是目前允許的最大值。

格式:int newsocket=(int socketfd,struct sockaddr_in *peer,int*addrlen);

該呼叫取得佇列上的第乙個連線請求並建立乙個具有與sockfd相同特性的套節字。如果沒有等待的連線請求,此呼叫阻塞呼叫者直到一連線請求到達。連線成功後,該呼叫將用對端的位址結構和位址長度填充引數peer和addlen,如果對客戶端的位址資訊不感興趣,這兩個引數用0代替。

格式:connect(int socketfd,struct sockaddr_in *servsddr,int addrlen)

客戶端取得套接字描述符後,用該呼叫建立與伺服器的連線,引數socketfd為socket()系統呼叫返回的套節字描述符,第二和第三個引數是指向目的位址的結構及以位元組計量的目的位址的長度(這裡目的位址應為伺服器位址)。呼叫成功返回0,否則將返回-1並設定errno。

一旦建立連線,就可以用系統呼叫read和write像普通檔案那樣向網路上傳送和接受資料。read接受三個引數:乙個是套節字描述符;乙個為資料將被填入的緩衝區,還有乙個整數指明要讀的位元組數,它返回實際讀入的位元組數,出錯時返回-1,遇到檔案尾則返回0。write也接受三個引數:乙個是套節字描述符;乙個為指向需要傳送資料的緩衝區,還有乙個整數指明要寫入檔案的位元組個數,它返回實際寫入的位元組數,出錯時返回-1。當然,也可以呼叫send和``recv`來對套節字進行讀寫,其呼叫與基本的read和write系統呼叫相似,只是多了乙個傳送方式引數。

格式 :int close(socketfd)

前面介紹了unix客戶/伺服器模式網路程式設計的基本思路和步驟。值得指出的是socket程式設計所涉及的系統呼叫不屬於基本系統呼叫範圍,其函式原形在libsocket.a檔案中,因此,在用cc命令對原程式進行編譯時需要帶-lsocket選項。

TCP IP程式設計實現遠端檔案傳輸

tcp ip程式設計實現遠端檔案傳輸 在tcp ip網路結構中,為了保證網路安全,網路人員往往需要在路由器上新增防火牆,禁止非法使用者用ftp等安全危害較大的tcp ip協議訪問主機 網路環境搭建好後,我們可以在伺服器端編寫fwq.c程式,負責接受客戶機的連線請求,並將從原始檔中讀取的資料傳送到客戶...

基於TCP IP協議實現檔案傳輸

public class fileserver extends thread override public void run 將map集合傳送到客戶端 oos.writeobject map oos.flush 2.接收客戶端傳送的檔案序號 scanner sc new scanner s.get...

Linux遠端檔案傳輸

linux系統中,難免會遇到一些要將某檔案通過網路傳送給其他主機的情況,而恰好兩台主機 都是linux系統的時候,我們就可以直接使用scp命令來傳輸檔案到另一台主機了。scp命令用於在網路中安全的傳輸檔案,格式為 例項1 將本地檔案123.txt傳輸到遠端主機192.168.157.128的目錄 h...