?? sdasd.txt
字號:
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
/* don't care about writefds and exceptfds: */
select(STDIN+1, &readfds, NULL, NULL, &tv);
if (FD_ISSET(STDIN, &readfds))
printf("A key was pressed!\n");
else
printf("Timed out.\n");
}
如果你是在一個 line buffered 終端上,那么你敲的鍵應該是回車 (RETURN),否則無論如何它都會超時。
現在,你可能回認為這就是在數據報套接字上等待數據的方式--你是對 的:它可能是。有些 Unix 系統可以按這種方式,而另外一些則不能。你 在嘗試以前可能要先看看本系統的 man page 了。
最后一件關于 select() 的事情:如果你有一個正在偵聽 (listen()) 的套 接字,你可以通過將該套接字的文件描述符加入到 readfds 集合中來看是 否有新的連接。
這就是我關于函數select() 要講的所有的東西。
參考書目:
Internetworking with TCP/IP, volumes I-III by Douglas E. Comer and
David L. Stevens. Published by Prentice Hall. Second edition ISBNs:
0-13-468505-9, 0-13-472242-6, 0-13-474222-2. There is a third edition of
this set which covers IPv6 and IP over ATM.
Using C on the UNIX System by David A. Curry. Published by
O'Reilly & Associates, Inc. ISBN 0-937175-23-4.
TCP/IP Network Administration by Craig Hunt. Published by O'Reilly
& Associates, Inc. ISBN 0-937175-82-X.
TCP/IP Illustrated, volumes 1-3 by W. Richard Stevens and Gary R.
Wright. Published by Addison Wesley. ISBNs: 0-201-63346-9,
0-201-63354-X, 0-201-63495-3.
Unix Network Programming by W. Richard Stevens. Published by
Prentice Hall. ISBN 0-13-949876-1.
On the web:
BSD Sockets: A Quick And Dirty Primer
(http://www.cs.umn.edu/~bentlema/unix/--has other great Unix
system programming info, too!)
Client-Server Computing
(http://pandonia.canberra.edu.au/ClientServer/socket.html)
Intro to TCP/IP (gopher)
(gopher://gopher-chem.ucdavis.edu/11/Index/Internet_aw/Intro_the_Inter
net/intro.to.ip/)
Internet Protocol Frequently Asked Questions (France)
(http://web.cnam.fr/Network/TCP-IP/)
The Unix Socket FAQ
(http://www.ibrado.com/sock-faq/)
RFCs--the real dirt:
RFC-768 -- The User Datagram Protocol (UDP)
(ftp://nic.ddn.mil/rfc/rfc768.txt)
RFC-791 -- The Internet Protocol (IP)
(ftp://nic.ddn.mil/rfc/rfc791.txt)
RFC-793 -- The Transmission Control Protocol (TCP)
(ftp://nic.ddn.mil/rfc/rfc793.txt)
RFC-854 -- The Telnet Protocol
(ftp://nic.ddn.mil/rfc/rfc854.txt)
RFC-951 -- The Bootstrap Protocol (BOOTP)
(ftp://nic.ddn.mil/rfc/rfc951.txt)
RFC-1350 -- The Trivial File Transfer Protocol (TFTP)
(ftp://nic.ddn.mil/rfc/rfc1350.txt)
***************************************************
*********************************************************
1. 介紹
FTP的目標是提高文件的共享性,提供非直接使用遠程計算機,使存儲介質對用戶透明和可靠高效地傳送數據。雖然我們也可以手工使用它,但是它的主要作用是供程序使用的。在閱讀本文之前最好能夠閱讀TCP協議標準規范和Telnet協議標準規范。
2. 概覽
在本節中我們將討論一些表面上的問題,有些名詞的定義請參閱TCP和Telnet參考文獻。我們先介紹一下(1)字節大小,在FTP中字節大小有兩個:邏輯字節大小和用于傳輸的字節大小。后者通常是8位,而前者可不一定是多少了。傳輸字節不必等于邏輯字節大小,也不必對數據結構進行解釋。(2)控制連接是建立在USER-PIT和SERVER-PI之間用于交換命令與應答的通信鏈路。(3)數據連接是傳輸數據的全雙工連接。傳輸數據可以發生在服務器DTP和用戶DTP之間也可以發生在兩個服務器DTP之間。(4)DTP:數據傳輸過程(DTP)建立和管理數據連接,DTP可以是主動的也可以是被動的。(5)EOR代表記錄尾。(6)NTV代表網絡虛擬終端,它的定義與在Telnet協議中的定義一致。(7)NVFS代表網絡虛擬文件系統。(8)FTP可以傳輸非連續的文件,這些文件的一部分稱為頁。(9)PI代表協議解釋器。(10)服務器DTP代表一種傳輸過程,它通常處于“主動”狀態,它和偵聽端口建立數據連接,它還可以為傳輸和存儲設置參數,并根據PI的指令傳輸數據。當然,DTP也可以轉入“被動”狀態。(11)服務器FTP進程,它是和用戶FTP進程一起工作的,它由PI和DTP組成。至于用戶FTP進程則是由PI,DTP和用戶接口組成的。下圖是FTP服務示意圖:
注意:數據連接是雙向的,它不用整個時間都存在。上圖中用戶PI開始控制連接,控制連接與Telnet協議很象。在開始階段,標準FTP命令由用戶PI產生并通過控制連接傳送到服務器進程。服務器PI向用戶PI返回標準應答。FTP命令指定數據連接參數和文件系統操作。用戶DTP在特定數據端口偵聽,服務器開始數據連接并以指定的參數開始數據傳輸。數據端口不必在開始FTP命令的機器上,但用戶或用戶FTP進程必須確定它在指定的數據端口上偵聽。這個數據連接是全雙工的。
在另外一種情況下,用戶或許希望在兩個主機間傳送文件,不是兩個本地主機。用戶在兩臺主機間建立控制連接,然后規劃數據連接。用這種方式,控制信息由用戶PI獲得,但是數據在服務器DTP之間傳送。下面就是一個例子:
協議要求數據傳輸在處理時打開控制連接。在完成FTP服務后由用戶中止控制連接,而服務器具體操作。如果在未接收命令時關閉了控制連接,服務器也會關閉數據傳輸。FTP和Telnet很有聯系,FTP使用Telnet協議進行控制連接,可有兩種方法達到目的:用戶PI或服務器PI可以在自己的過程中實現Telnet協議的功能;第二種方法是利用系統中現有的Telnet模塊。實現上,FTP對Telnet協議的依賴也不多,即使重新實現,代碼量也不大。
3. 數據傳輸功能
數據連接只傳輸數據,控制連接傳送命令和響應。幾個命令是關于在主機間傳輸數據的,數據傳輸基本上獨立于物理結構的,但是如果在壓縮傳輸模式下流式傳輸與文件結構有關,文件的屬性與表示類型有關。
3.1. 數據表示與保存
數據是在主機間的存儲設置間傳送的。因為兩個系統的數據存儲方式不同,因此需要對它進行轉換,在傳送文本時會有對ASCII表示的問題,在進行二進制傳送的時候,會有不同系統對字節長度規定不同的問題,有的系統是7位,有的系統可能是32位,這也需要進行轉換。需要提供數據表示與傳輸模型函數,但是FTP提供這方面的功能不多,超過FTP提供功能的那一部分要用戶自己實現。
3.1.1. 數據類型
數據表示是由用戶指定的表示類型,它可以是隱含的,也可以是用戶指定的。請一定注意:邏輯字節長度與物理字節長度是不同的。
3.1.1.1. ASCII類型
這是所有FTP必須實現的默認類型,用于傳送文本文件,當在主機間使用EBCDIC傳送時更方便,則不使用ASCII類型。發送方將內部表示轉換為NVT-ASCII格式,接收方則進行相反的過程接收數據。根據NVT標準,要在行結束處使用序列。NVT-ASCII是8位的。ASCII和EBCDIC的格式參數在下面討論。
3.1.1.2. EBCDIC類型
它是作為ASCII的另一種方法在主機間傳送數據的數據類型。EBCDIC和ASCII很象,僅在類型的功能描述上有一些差別。行結束符使用很少。
3.1.1.3. 圖象類型
在此類型下傳送的數據被看作連續的位,發送方將數據打包到8位傳輸字節中傳送。因為結構的需要要對傳送數據進行填充,填充字節全部為0,填充必須在文件結構時使用,而且要標記出以便接收方過濾掉。它用于傳送二進制數據和有效地傳送和存儲文件,因此所有FTP也必須實現。
3.1.1.4. 本地類型
也可以以十進制指定邏輯字節大小。如果物理字節大小和邏輯字節大小不同,直接將物理數據打包為邏輯字節,不用什么填充。接收方根據邏輯字節大小進行和本機的存儲特點進行轉換。傳輸必須是可重復的,也就是說,相同的文件相同的參數,那內容必須是一樣的。
3.1.1.5. 格式控制
ASCII和EBCDIC有一個可選參數,它說明文件垂直格式控制,下面的數據表示類型在FTP中有定義。字符文件可能有三種用途,打印,存儲或留待以后處理。如果是用于打印,那主機必須知道垂直格式控制的表示,如果存儲或等以后處理,也需要保留文件格式。如果在遠程主機上處理完后傳輸回本地主機,要保證遠程主機處理時沒有麻煩。這都需要在ASCII和EBCDIC格式上加入新的參數。
3.1.1.5.1. NON PRINT
未指定第二個參數是它是默認值。它必須為所有FTP接受。如果傳輸的文件是用于打印的,則使用邊界和間隔的默認值。通常它不用于打印目的,而用于保存文件或執行文件。
3.1.1.5.2. TELNET格式控制
文件包括ASCII/EBCDIC垂直格式控制,這些控制字符可以使打印正常進行。
3.1.1.5.3. CARRIAGE CONTROL (ASA)
文件包含ASA (FORTRAN)垂直格式控制字符。在以ASA標準形成的行中,第一個字符不打印,它用于決定打印前的走紙量。下面是定義了的ASA字符:
blank: 向下移動1行;0:向下移動2行;1:移動至下一頁;+:不移動
打印機必須能夠決定結構體的結束。如果文件本身有記錄結構就沒有問題,如果沒有,用于區別打印行,但這些格式標記已經由ASA控制字符使用了。
3.1.2. 數據結構
除了有不同的數據類型外,FTP還允許有不同的文件結構,下面是三種文件結構:文件式結構:文件中沒有內部結構,文件被看作是二進制流;記錄結構:文件是由一系列記錄組成的;頁結構:文件是由不同的索引頁組成的。
如果未使用STRU命令,文件結構是默認值。文件的結構會影響傳輸模型,存儲和數據表示。文件本來的屬性和保存它的主機有關,不同的機器會以自己的方式保存文件。在不同主機間傳送文件時必須使主機能夠識別相互的表示。有些主機上的文件是面向字節的,有些是面向記錄的,在傳送時就會出現問題。那就要在接收方進行內部轉換。在進行轉換的時候,需要區別記錄的邊界,在ASCII中使用,在EBCDIC中使用作為分
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -