整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          CAD中單行文字和多行文字的互換技巧

          CAD中單行文字和多行文字的互換技巧

          AD也瘋狂

          首先我們來了解一下CAD單行文字和多行文字各自的優勢。

          單行文字優勢:格式簡單、控制容易,還可以輸入鋼筋符號的特殊符號;

          多行文字優勢:支持換行,支持段落、制表位,編寫大段文字有明顯優勢。

          我們知道,多行文字用X炸開就可以變成單行文字,那如果希望將單行文字變成多行文字怎么辦呢?

          其實,CAD自帶有這樣一個合并的功能,命令為:TXT2MTXT。只是目前只有CAD高版本才有,想知道你的CAD版本是否支持,可以輸入這個命令,回車一下,看是否能執行就可以了,如果顯示是未知命令,那就是不支持了。

          如果顯示是未知命令,那就是不支持了。

          這個命令的操作很簡單,和平常命令操作一樣,執行命令后選擇要合并的單行文字就可以了。并且,在執行命令后,命令行會提供了一個選項:設置(SE),可以設置合并時單行文字的排序方式,默認是從上往下排序,也可以設置成按選擇的順序排序。

          如果沒有特殊需要,就不需要修改設置。

          下面來看看效果

          轉換前

          轉換前的效果是三個獨立的單行文字。

          輸入命令選擇文字會提示

          轉換后會提示

          最后的效果

          不過最后的效果也可能是另外一種情況

          不過最后的效果也可能是這種情況

          出現這種情況時,可以嘗試在設置(SE)時勾選“自動換行文字”或者手動對多行文字進行調整

          勾選“自動換行文字”

          本期的技巧就分享到這了,如果你有其它更好的方法,歡迎留言和大家分享哦,謝謝關注!

          口調試

          串口調試主要有 根據/proc系統信息確認串口狀態,stty命令,編程調試 三種調試方法,下面我們分別具體介紹下。

          根據設備節點確認串口是否正常

          系統上電時,默認會使能串口,我們可以通過dmesg | grep ttyS 查看系統加載的串口設備。

          也可以通過 cat /proc/tty/driver/serial 查看串口信息。

          如果執行 echo "123" > /dev/ttyS4 ,則會發送數據到ttyS4,通過串口線將串口接到PC 串口助手,確認是否收到數據。

          如果此時再去查看串口設備,會看到uart4 的tx 發送了5個字符。

          stty 命令

          stty語法

          stty --help
          
          Usage: stty [-F DEVICE] [--file=DEVICE] [SETTING]...
            or: stty [-F DEVICE] [--file=DEVICE] [-a|--all]
            or: stty [-F DEVICE] [--file=DEVICE] [-g|--save]
          [選項]
          -a, --all :   以容易閱讀的方式打印當前的所有配置;
          -g, --save: 以stty終端可讀方式打印當前的所有配置。
          -F, --file:   打印當前的所有設置打開指定的設備,并用此設備作為輸入來代替標準輸入
          [參數]
          終端設置:指定終端命令行的設置選項。  
          

          串口配置

          stty -F /dev/ttyS0 speed 115200 cs8 -parenb -cstopb
          

          設置串口ttyS0波特率為115200,8位數據位,1位停止位,無校驗位。

          查看串口屬性

          stty -a -F /dev/ttyS0
          speed 9600 baud; rows 0; columns 0; line=0;
          intr=^C; quit=^\; erase=^?; kill=^U; eof=^D; eol=<undef>;
          eol2=<undef>; swtch=<undef>; start=^Q; stop=^S; susp=^Z; rprnt=^R;
          werase=^W; lnext=^V; discard=^O; min=1; time=0;
          -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
          -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
          -iuclc -ixany -imaxbel -iutf8
          opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
          isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
          echoctl echoke -flusho -extproc
          

          stty參數含義

          特殊字符:
            dsusp 字符   每當輸入刷新時會發送一個用于終端阻塞信號的字符
             eof  字符    表示文件末尾而發送的字符(用于終止輸入)
             eol  字符    為表示行尾而發送的字符
            eol2 字符    為表示行尾而發送的另一個可選字符
             erase 字符   擦除前一個輸入文字的字符
             intr 字符    用于發送中斷信號的字符
             kill 字符    用于擦除當前終端行的字符
            lnext 字符   用于輸入下一個引用文字的字符
             quit 字符    用于發送退出信號的字符
            rprnt 字符   用于重繪當前行的字符
             start 字符   在停止后重新開啟輸出的字符
             stop 字符    停止輸出的字符
             susp 字符    發送終端阻斷信號的字符
            swtch 字符   在不同的shell 層次間切換的字符
            werase 字符  擦除前一個輸入的單詞的字符
           
          特殊設置:
             N            設置輸入輸出速度為N 波特
            cols N       統治內核終端上有N 欄
            columns N    等于cols N
             ispeed N     設置輸入速度為N 波特
            line N       設置行約束規則為N
             min N        和 -icanon 配合使用,設置每次一完整讀入的最小字符數為<N>
             ospeed N     設置輸出速度為N 波特
            rows N       向內核通告此終端有N 行
            size         根據內核信息輸出當前終端的行數和列數
             speed        輸出終端速度(單位為波特)
             time N       和-icanon 配合使用,設置讀取超時為N 個十分之一秒
           
          控制設置:
             [-]clocal    禁用調制解調器控制信號
             [-]cread     允許接收輸入
            [-]crtscts   啟用RTS/CTS 握手
             csN          設置字符大小為N 位,N 的范圍為5 到8
             [-]cstopb    每個字符使用2 位停止位 (要恢復成1 位配合"-"即可)
             [-]hup       當最后一個進程關閉標準終端后發送掛起信號
             [-]hupcl     等于[-]hup
             [-]parenb    對輸出生成奇偶校驗位并等待輸入的奇偶校驗位
             [-]parodd    設置校驗位為奇數 (配合"-"則為偶數)
           
          輸入設置:
             [-]brkint    任務中斷會觸發中斷信號
             [-]icrnl     將回車轉換為換行符
             [-]ignbrk    忽略中斷字符
             [-]igncr     忽略回車
             [-]ignpar    忽略含有奇偶不對稱錯誤的字符
            [-]imaxbel   發出終端響鈴但不刷新字符的完整輸入緩沖
             [-]inlcr     將換行符轉換為回車
             [-]inpck     啟用輸入奇偶性校驗
             [-]istrip    剝除輸入字符的高8 位比特
            [-]iutf8     假定輸入字符都是UTF-8 編碼
            [-]iuclc     將大寫字母轉換為小寫
            [-]ixany     使得任何字符都會重啟輸出,不僅僅是起始字符
             [-]ixoff     啟用開始/停止字符傳送
             [-]ixon      啟用XON/XOFF 流控制
             [-]parmrk    標記奇偶校驗錯誤 (結合255-0 字符序列)
             [-]tandem    等于[-]ixoff
           
          輸出設置:
            bsN          退格延遲的風格,N 的值為0 至1
            crN          回車延遲的風格,N 的值為0 至3
            ffN          換頁延遲的風格,N 的值為0 至1
            nlN          換行延遲的風格,N 的值為0 至1
            [-]ocrnl     將回車轉換為換行符
            [-]ofdel     使用刪除字符代替空字符作填充
            [-]ofill     延遲時使用字符填充代替定時器同步
            [-]olcuc     轉換小寫字母為大寫
            [-]onlcr     將換行符轉換為回車
            [-]onlret    使得換行符的行為表現和回車相同
            [-]onocr     不在第一列輸出回車
             [-]opost     后續進程輸出
            tabN         水平制表符延遲的風格,N 的值為0 至3
            tabs         等于tab0
            -tabs        等于tab3
            vtN          垂直制表符延遲的風格,N 的值為0 至1
           
          本地設置:
             [-]crterase  擦除字符回顯為退格符
            crtkill      依照echoprt 和echoe 的設置清除所有行
            -crtkill     依照echoctl 和echol 的設置清除所有行
            [-]ctlecho   在頭字符中輸出控制符號("^c")
             [-]echo      回顯輸入字符
            [-]echoctl   等于[-]ctlecho
             [-]echoe     等于[-]crterase
             [-]echok     在每清除一個字符后輸出一次換行
            [-]echoke    等于[-]crtkill 意義相同
             [-]echonl    即使沒有回顯任何其它字符也輸出換行
            [-]echoprt   在"\"和"/"之間向后顯示擦除的字符
             [-]icanon    啟用erase、kill、werase 和rprnt 等特殊字符
             [-]iexten    允許POSIX 標準以外的特殊字符
             [-]isig      啟用interrupt、quit和suspend 等特殊字符
             [-]noflsh    在interrupt 和 quit 特殊字符后禁止刷新
            [-]prterase  等于[-]echoprt
            [-]tostop    中止嘗試向終端寫入數據的后臺任務
            [-]xcase     和icanon 配合使用,用轉義符"\"退出大寫狀態
           
          綜合設置:
            [-]LCASE     等于[-]lcase
             cbreak       等于-icanon
             -cbreak      等于icanon
             cooked       等于brkint ignpar istrip icrnl ixon opost isig icanon eof eol 等的默認值
             -cooked      等于-raw
             crt          等于echoe echoctl echoke
             dec          等于echoe echoctl echoke -ixany intr ^c erase 0177 kill ^u
            [-]decctlq   等于[-]ixany
             ek           清除所有字符,將它們回溯為默認值
             evenp        等于parenb -parodd cs7
             -evenp       等于-parenb cs8
            [-]lcase     等于xcase iuclc olcuc
             litout       等于-parenb -istrip -opost cs8
             -litout      等于parenb istrip opost cs7
             nl           等于-icrnl -onlcr
             -nl          等于icrnl -inlcr -igncr onlcr -ocrnl -onlret
             oddp         等于parenb parodd cs7
             -oddp        等于-parenb cs8
             [-]parity    等于[-]evenp
             pass8        等于-parenb -istrip cs8
             -pass8       等于parenb istrip cs7
             raw          等于-ignbrk -brkint -ignpar -parmrk -inpck -istrip
                           -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany
                           -imaxbel -opost -isig -icanon -xcase min 1 time 0
             -raw         等于cooked
             sane         等于cread -ignbrk brkint -inlcr -igncr icrnl -iutf8
                          -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr
                          -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
                          isig icanon iexten echo echoe echok -echonl -noflsh
                          -xcase -tostop -echoprt echoctl echoke,
                          所有特殊字符均使用默認值
          

          串口編程調試

          串口相關操作

          在Linux下,除了網絡設備,其余的都是文件的形式,串口設備也一樣在/dev下。

          打開串口

          示例:

          fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
          

          在打開串口時,除了需要用到 O_RDWR (可讀寫)選項標志外,

          O_NOCTTY:告訴 Linux “本程序不作為串口的‘控制終端’”。如果不使用該選項,會有一些輸入字符影響進程運行(如一些產生中斷信號的鍵盤輸入字符等)。

          O_NDELAY:``標志則是告訴Linux,這個程序并不關心DCD信號線的狀態——也就是不關心端口另一端是否已經連接。

          關閉串口:

          close(fd)
          

          讀寫串口:

          與普通文件一樣,使用read,write函數。 示例:

          read(fd,buff,8);
          write(fd,buff,8);
          

          串口屬性設置

          很多系統都支持POSIX終端(串口)接口.程序可以利用這個接口來改變終端的參數,比如,波特率,字符大小等等.要使用這個端口的話,你必須將<termios.h>頭文件包含到你的程序中。這個頭文件中定義了終端控制結構體和POSIX控制函數。

          termios 結構體:

          struct termios {
            tcflag_t c_cflag    / 控制標志
            tcflag_t c_iflag;   / 輸入標志
            tcflag_t c_oflag;   / 輸出標志
            tcflag_t c_lflag;   / 本地標志
            tcflag_t c_cc[NCCS]; / 控制字符
          };
          

          其中我們更關注的是c_cflag控制選項。其中包含了波特率、數據位、校驗位、停止位的設置。

          c_cflag 控制標志常量

          • CBAUD   (不屬于 POSIX) 波特率掩碼 (4+1 位)。
          • CBAUDEX  (不屬于 POSIX) 擴展的波特率掩碼 (1 位),包含在 CBAUD 中。(POSIX 規定波特率存儲在 termios 結構中,并未精確指定它的位置,而是提供了函數 cfgetispeed() 和 cfsetispeed() 來存取它。一些系統使用 c_cflag 中 CBAUD 選擇的位,其他系統使用單獨的變量,例如 sg_ispeed 和 sg_ospeed 。)
          • CSIZE   字符長度掩碼。取值為 CS5, CS6, CS7, 或 CS8。
          • CSTOPB 設置兩個停止位,而不是一個。
          • CREAD 打開接受者。
          • PARENB  允許輸出產生奇偶信息以及輸入的奇偶校驗。
          • PARODD 輸入和輸出是奇校驗。
          • HUPCL   在最后一個進程關閉設備后,降低 modem 控制線 (掛斷)。(?)
          • CLOCAL 忽略 modem 控制線。
          • LOBLK   (不屬于 POSIX) 從非當前 shell 層阻塞輸出(用于 shl )。(?)
          • CIBAUD (不屬于 POSIX) 輸入速度的掩碼。CIBAUD 各位的值與 CBAUD 各位相同,左移了 IBSHIFT 位。
          • CRTSCTS  (不屬于 POSIX) 啟用 RTS/CTS (硬件) 流控制。

          c_iflag 輸入標志常量

          • IGNBRK   忽略輸入中的 BREAK 狀態。
          • BRKINT   如果設置了 IGNBRK,將忽略 BREAK。如果沒有設置,但是設置了 BRKINT,那么 BREAK 將使得輸入和輸出隊列被刷新,如果終端是一個前臺進程組的控制終端,這個進程組中所有進程將收到 SIGINT 信號。如果既未設置 IGNBRK 也未設置 BRKINT,BREAK 將視為與 NUL 字符同義,除非設置了 PARMRK,這種情況下它被視為序列 7 >BRKINT   如果設置了 IGNBRK,將忽略 BREAK。如果沒有設置,但是設置了 BRKINT,那么 BREAK 將使得輸入和輸出隊列被刷新,如果終端是一個前臺進程組的控制終端,這個進程組中所有進程將收到 SIGINT 信號。如果既未設置 IGNBRK 也未設置 BRKINT,BREAK 將視為與 NUL 字符同義,除非設置了 PARMRK,這種情況下它被視為序列 \377 \0 \0。< >BRKINT   如果設置了 IGNBRK,將忽略 BREAK。如果沒有設置,但是設置了 BRKINT,那么 BREAK 將使得輸入和輸出隊列被刷新,如果終端是一個前臺進程組的控制終端,這個進程組中所有進程將收到 SIGINT 信號。如果既未設置 IGNBRK 也未設置 BRKINT,BREAK 將視為與 NUL 字符同義,除非設置了 PARMRK,這種情況下它被視為序列 \377 \0 \0。<。
          • IGNPAR   忽略楨錯誤和奇偶校驗錯。
          • PARMRK  如果沒有設置 IGNPAR,在有奇偶校驗錯或楨錯誤的字符前插入 7 >PARMRK  如果沒有設置 IGNPAR,在有奇偶校驗錯或楨錯誤的字符前插入 \377 \0。如果既沒有設置 IGNPAR 也沒有設PARMRK,將有奇偶校驗錯或楨錯誤的字符視為 \0。<。如果既沒有設置 IGNPAR 也沒有設PARMRK,將有奇偶校驗錯或楨錯誤的字符視為 >PARMRK  如果沒有設置 IGNPAR,在有奇偶校驗錯或楨錯誤的字符前插入 \377 \0。如果既沒有設置 IGNPAR 也沒有設PARMRK,將有奇偶校驗錯或楨錯誤的字符視為 \0。<。
          • INPCK   啟用輸入奇偶檢測。
          • ISTRIP  去掉第八位。
          • INLCR   將輸入中的 NL 翻譯為 CR。
          • IGNCR   忽略輸入中的回車。
          • ICRNL   將輸入中的回車翻譯為新行 (除非設置了 IGNCR)。
          • IUCLC   (不屬于 POSIX) 將輸入中的大寫字母映射為小寫字母。
          • IXON    啟用輸出的 XON/XOFF 流控制。
          • IXANY  (不屬于 POSIX.1;XSI) 允許任何字符來重新開始輸出。(?)
          • IXOFF  啟用輸入的 XON/XOFF 流控制。
          • IMAXBEL (不屬于 POSIX) 當輸入隊列滿時響零。Linux 沒有實現這一位,總是將它視為已設置。

          c_oflag 輸出標志常量

          • OPOST   啟用具體實現自行定義的輸出處理。其余 c_oflag 標志常量定義在 POSIX 1003.1-2001 中,除非另外說明。
          • OLCUC   (不屬于 POSIX) 將輸出中的小寫字母映射為大寫字母。
          • ONLCR   (XSI) 將輸出中的新行符映射為回車-換行。
          • OCRNL   將輸出中的回車映射為新行符
          • ONOCR 不在第 0 列輸出回車。
          • ONLRET 不輸出回車。
          • OFILL 發送填充字符作為延時,而不是使用定時來延時。
          • OFDEL   (不屬于 POSIX) 填充字符是 ASCII DEL (0177)。如果不設置,填充字符則是 ASCII NUL。
          • NLDLY   新行延時掩碼。取值為 NL0 和 NL1。
          • CRDLY   回車延時掩碼。取值為 CR0, CR1, CR2, 或 CR3。
          • TABDLY  水平跳格延時掩碼。取值為 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值為 TAB3,即 XTABS,將擴展跳格為空格 (每個跳格符填充 8 個空格)。(?)
          • BSDLY   回退延時掩碼。取值為 BS0 或 BS1。(從來沒有被實現過)
          • VTDLY   豎直跳格延時掩碼。取值為 VT0 或 VT1。
          • FFDLY   進表延時掩碼。取值為 FF0 或 FF1。

          c_lflag 本地標志常量

          • ISIG    當接受到字符 INTR, QUIT, SUSP, 或 DSUSP 時,產生相應的信號。
          • ICANON   啟用標準模式 (canonical mode)。允許使用特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE,以及按行的緩沖。
          • XCASE   (不屬于 POSIX; Linux 下不被支持) 如果同時設置了 ICANON,終端只有大寫。輸入被轉換為小寫,除了以 \ 前綴的字符。輸出時,大寫字符被前綴 \,小寫字符被轉換成大寫。
          • ECHO    回顯輸入字符。
          • ECHOE  如果同時設置了 ICANON,字符 ERASE 擦除前一個輸入字符,WERASE 擦除前一個詞。
          • ECHOK  如果同時設置了 ICANON,字符 KILL 刪除當前行。
          • ECHONL  如果同時設置了 ICANON,回顯字符 NL,即使沒有設置 ECHO。
          • ECHOCTL (不屬于 POSIX) 如果同時設置了 ECHO,除了 TAB, NL, START, 和 STOP 之外的 ASCII 控制信號被回顯為 ^X, 這里 X 是比控制信號大 0x40 的 ASCII 碼。例如,字符 0x08 (BS) 被回顯為 ^H。
          • ECHOPRT (不屬于 POSIX) 如果同時設置了 ICANON 和 IECHO,字符在刪除的同時被打印。
          • ECHOKE   (不屬于 POSIX) 如果同時設置了 ICANON,回顯 KILL 時將刪除一行中的每個字符,如同指定了 ECHOE 和 ECHOPRT 一樣。
          • DEFECHO (不屬于 POSIX) 只在一個進程讀的時候回顯。
          • FLUSHO   (不屬于 POSIX; Linux 下不被支持) 輸出被刷新。這個標志可以通過鍵入字符 DISCARD 來開關。
          • NOFLSH   禁止在產生 SIGINT, SIGQUIT 和 SIGSUSP 信號時刷新輸入和輸出隊列。
          • TOSTOP   向試圖寫控制終端的后臺進程組發送 SIGTTOU 信號。IEXTEN   啟用實現自定義的輸入處理。這個標志必須與ICANON 同時使用,才能解釋特殊字符 EOL2,LNEXT,REPRINT 和 WERASE,IUCLC 標志才有效。

          c_cc 特殊的控制字符

          • VINTR   (003, ETX, Ctrl-C, or also 0177, DEL, rubout) 中斷字符。發出 SIGINT 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。
          • VQUIT   (034, FS, Ctrl-) 退出字符。發出 SIGQUIT 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。
          • VERASE  (0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 刪除字符。刪除上一個還沒有刪掉的字符,但不刪除上一個 EOF 或行首。當設置 ICANON 時可被識別,不再作為輸入傳遞。
          • VKILL   (025, NAK, Ctrl-U, or Ctrl-X, or also @) 終止字符。刪除自上一個 EOF 或行首以來的輸入。當設置 ICANON 時可被識別,不再作為輸入傳遞。
          • VEOF   (004, EOT, Ctrl-D) 文件尾字符。更精確地說,這個字符使得 tty 緩沖中的內容被送到等待輸入的用戶程序中,而不必等到 EOL。如果它是一行的第一個字符,那么用戶程序的 read() 將返回 0,指示讀到了 EOF。當設置 ICANON 時可被識別,不再作為輸入傳遞。
          • VMIN   非 canonical 模式讀的最小字符數。
          • VEOL   (0, NUL) 附加的行尾字符。當設置 ICANON 時可被識別。
          • VTIME  非 canonical 模式讀時的延時,以十分之一秒為單位。
          • VEOL2  (not in POSIX; 0, NUL) 另一個行尾字符。當設置 ICANON 時可被識別。
          • VSWTCH (not in POSIX; not supported under Linux; 0, NUL) 開關字符。(只為 shl 所用。)
          • VSTART (021, DC1, Ctrl-Q) 開始字符。重新開始被 Stop 字符中止的輸出。當設置 IXON 時可被識別,不再作為輸入傳遞。
          • VSTOP   (023, DC3, Ctrl-S) 停止字符。停止輸出,直到鍵入 Start 字符。當設置 IXON 時可被識別,不再作為輸入傳遞。
          • VSUSP   (032, SUB, Ctrl-Z) 掛起字符。發送 SIGTSTP 信號。當設置 ISIG 時可被識別,不再作為輸入傳遞。
          • VDSUSP (not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延時掛起信號。當用戶程序讀到這個字符時,發送 SIGTSTP 信號。當設置 IEXTEN 和 ISIG,并且系統支持作業管理時可被識別,不再作為輸入傳遞。
          • VLNEXT  (not in POSIX; 026, SYN, Ctrl-V) 字面上的下一個。引用下一個輸入字符,取消它的任何特殊含義。當設置 IEXTEN 時可被識別,不再作為輸入傳遞。
          • VWERASE (not in POSIX; 027, ETB, Ctrl-W) 刪除詞。當設置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。
          • VREPRINT (not in POSIX; 022, DC2, Ctrl-R) 重新輸出未讀的字符。當設置 ICANON 和 IEXTEN 時可被識別,不再作為輸入傳遞。
          • VDISCARD  (not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 開關:開始/結束丟棄未完成的輸出。當設置 IEXTEN 時可被識別,不再作為輸入傳遞。

          調用read 函數讀取串口數據時, 返回讀取數據的數量需要考慮兩個變量: MIN 和 TIME 。

          MIN 和 TIME 在 termios 結構的 c_cc 成員的數組 下標名為 VMIN 和 VTIME 。MIN是指一次 read 調用期望返回的最小字節數 。 VTIME 說明等待數據到達的分秒數(秒的 1/10 為分秒) 。 TIME 與 MIN 組合使用的 具體含義分 為 以下四種情形:

          1. 當 MIN > 0 TIME > 0 時計時器在收到第一個字節后啟動,在計時器超時之前 TIME 的時間到) ),若已收到 MIN個字節,則 read 返回 MIN 個字節,否則,在計時器超時后返回實際接收到的字節。注意:因為只有在接收到第一個字節時才開始計時,所以至少可以返回1個字節。這種情形中,在接到第一個字節之前,調用者阻塞。如果在調用read時數據已經可用,則如同在read后數據立即被接到一樣。
          2. 當 MIN > 0 TIME=0 時MIN個字節完整接收后, read 才返回,這可能會造成 read 無限期地阻塞。
          3. 當 MIN=0, TIME > 0 時TIME為允許等待的最大時間,計 時器在調用 read 時立即啟動,在串口接到 1 字節數據或者計時器超時后即返回,如果是計時器超時,則返回 0 。
          4. 當 MIN=0 TIME=0 時如果有數據可用,則read 最多返回所要求的字節數,如果無數據可用,則 read 立即返回 0 。

          終端api函數接口

          tcgetattr

          tcgetattr() 得到與 fd 指向的對象相關的參數,將它們保存于 termios_p 引用的 termios 結構中。函數可以從后臺進程中調用;但是,終端屬性可能被后來的前臺進程所改變。

          tcsetattr

          tcsetattr() 設置與終端相關的參數 (除非需要底層支持卻無法滿足),使用 termios_p 引用的 termios 結構。optional_actions 指定了什么時候改變會起作用:

          • TCSANOW   改變立即發生
          • TCSADRAIN   改變在所有寫入 fd 的輸出都被傳輸后生效。這個函數應當用于修改影響輸出的參數時使用。
          • TCSAFLUSH  改變在所有寫入 fd 引用的對象的輸出都被傳輸后生效,所有已接受但未讀入的輸入都在改變發生前丟棄。

          tcsendbreak

          tcsendbreak() 傳送連續的 0 值比特流,持續一段時間,如果終端使用異步串行數據傳輸的話。如果 duration 是 0,它至少傳輸 0.25 秒,不會超過 0.5 秒。如果 duration 非零,它發送的時間長度由實現定義。如果終端并非使用異步串行數據傳輸,tcsendbreak() 什么都不做。

          tcdrain

          tcdrain() 等待直到所有寫入 fd 引用的對象的輸出都被傳輸。

          tcflush

          tcflush() 丟棄要寫入 引用的對象,但是尚未傳輸的數據,或者收到但是尚未讀取的數據,取決于 queue_selector 的值:

          • TCIFLUSH   刷新收到的數據但是不讀
          • TCOFLUSH 刷新寫入的數據但是不傳送
          • TCIOFLUSH  同時刷新收到的數據但是不讀,并且刷新寫入的數據但是不傳送

          tcflow

          tcflow() 掛起 fd 引用的對象上的數據傳輸或接收,取決于 action 的值:

          • TCOOFF   掛起輸出、
          • TCOON    重新開始被掛起的輸出
          • TCIOFF   發送一個 STOP 字符,停止終端設備向系統傳送數據
          • TCION    發送一個 START 字符,使終端設備向系統傳輸數據

          串口屬性設置示例

          設置串口屬性主要是配置termios結構體中的各個變量,大致流程如下:

          1. 使用函數tcgetattr保存原串口屬性
          struct termios newtio,oldtio;
          tcgetattr(fd,&oldtio);
          
          1. 通過位掩碼的方式激活本地連接和接受使能選項:CLOCAL和CREAD
          newtio.c_cflag |=CLOCAL | CREAD;
          
          1. 使用函數cfsetispeed和cfsetospeed設置數據傳輸率
          cfsetispeed(&newtio,B115200);
          cfsetospeed(&newtio,B115200);
          
          1. 通過位掩碼設置字符大小。
          newtio.c_cflag &=~CSIZE;
          newtio.c_cflag |=CS8;
          
          1. 設置奇偶效驗位需要用到兩個termios中的成員:c_cflag和c_iflag。首先要激活c_cflag中的校驗位使能標志PARENB和是否進行奇偶效驗,同時還要激活c_iflag中的奇偶效驗使能。 設置奇校驗:
          newtio.c_cflag |=PARENB;
          newtio.c_cflag |=PARODD;
          newtio.c_iflag |=(INPCK | ISTRIP);
          設置偶校驗:
          newtio.c_iflag |=(INPCK|ISTRIP);
          newtio.c_cflag |=PARENB;
          newtio.c_cflag |=~PARODD;
          
          1. 激活c_cflag中的CSTOPB設置停止位。若停止位為1,則清除CSTOPB;若停止位為0,則激活CSTOPB。
          newtio.c_cflag &=~CSTOPB;
          
          1. 設置最少字符和等待時間。在對接收字符和等待時間沒有特別要求的情況下,可以將其設置為0。
          newtio.c_cc[VTIME]=0;
          newtio.c_cc[VMIN]=0;
          
          1. 調用函數”tcflush(fd,queue_selector)”來處理要寫入引用的對象,queue_selector可能的取值有以下幾種。
          • TCIFLUSH:刷新收到的數據但是不讀
          • TCOFLUSH:刷新寫入的數據但是不傳送
          • TCIOFLUSH:同時刷新收到的數據但是不讀,并且刷新寫入的數據但是不傳送。
          1. 激活配置。在完成配置后,需要激活配置使其生效。使用tcsetattr()函數。
          int tcsetattr(int filedes,int opt,const struct termios termptr);
          

          串口編程實例

          /@file      main.c
            @brief       串口應用編程測試
            @details
            @author      zhongyi  
            @date        2022-04-30
            @version     V1.0
           
           /
          
          / 包含的頭文件 /
          #include <stdio.h>        //標準輸入輸出,如printf、scanf以及文件操作
          #include <stdlib.h>        //標準庫頭文件,定義了五種類型、一些宏和通用工具函數
          #include <unistd.h>        //定義 read write close lseek 等Unix標準函數
          #include <sys/types.h>    //定義數據類型,如 ssiz e_t off_t 等
          #include <sys/stat.h>    //文件狀態
          #include <fcntl.h>        //文件控制定義
          #include <termios.h>    //終端I/O
          #include <errno.h>        //與全局變量 errno 相關的定義
          #include <getopt.h>        //處理命令行參數
          #include <string.h>        //字符串操作
          #include <time.h>        //時間
          #include <sys/select.h>    //select函數
          
          #define DEV_NAME    "/dev/ttyS4"    ///< 串口設備
          
          
          /@brief   設置串口參數:波特率,數據位,停止位和效驗位
            @param[in]  fd         類型  int      打開的串口文件句柄
            @param[in]  nSpeed     類型  int     波特率
            @param[in]  nBits     類型  int     數據位   取值 為 7 或者8
            @param[in]  nParity     類型  int     停止位   取值為 1 或者2
            @param[in]  nStop      類型  int      效驗類型 取值為N,E,O,,S
            @return     返回設置結果
            - 0         設置成功
            - -1     設置失敗
           /
          int setOpt(int fd, int nSpeed, int nBits, int nParity, int nStop)
          {
              struct termios newtio, oldtio;
          
              // 保存測試現有串口參數設置,在這里如果串口號等出錯,會有相關的出錯信息
              if (tcgetattr(fd, &oldtio) !=0)
              {
                  perror("SetupSerial 1");
                  return -1;
              }
          
              bzero(&newtio, sizeof(newtio));        //新termios參數清零
              newtio.c_cflag |=CLOCAL | CREAD;    //CLOCAL--忽略 modem 控制線,本地連線, 不具數據機控制功能, CREAD--使能接收標志
              // 設置數據位數
              newtio.c_cflag &=~CSIZE;    //清數據位標志
              switch (nBits)
              {
                  case 7:
                      newtio.c_cflag |=CS7;
                  break;
                  case 8:
                      newtio.c_cflag |=CS8;
                  break;
                  default:
                      fprintf(stderr, "Unsupported data size\n");
                      return -1;
              }
              // 設置校驗位
              switch (nParity)
              {
                  case 'o':
                  case 'O':                     //奇校驗
                      newtio.c_cflag |=PARENB;
                      newtio.c_cflag |=PARODD;
                      newtio.c_iflag |=(INPCK | ISTRIP);
                      break;
                  case 'e':
                  case 'E':                     //偶校驗
                      newtio.c_iflag |=(INPCK | ISTRIP);
                      newtio.c_cflag |=PARENB;
                      newtio.c_cflag &=~PARODD;
                      break;
                  case 'n':
                  case 'N':                    //無校驗
                      newtio.c_cflag &=~PARENB;
                      break;
                  default:
                      fprintf(stderr, "Unsupported parity\n");
                      return -1;
              }
              // 設置停止位
              switch (nStop)
              {
                  case 1:
                      newtio.c_cflag &=~CSTOPB;
                  break;
                  case 2:
                      newtio.c_cflag |=CSTOPB;
                  break;
                  default:
                      fprintf(stderr,"Unsupported stop bits\n");
                      return -1;
              }
              // 設置波特率 2400/4800/9600/19200/38400/57600/115200/230400
              switch (nSpeed)
              {
                  case 2400:
                      cfsetispeed(&newtio, B2400);
                      cfsetospeed(&newtio, B2400);
                      break;
                  case 4800:
                      cfsetispeed(&newtio, B4800);
                      cfsetospeed(&newtio, B4800);
                      break;
                  case 9600:
                      cfsetispeed(&newtio, B9600);
                      cfsetospeed(&newtio, B9600);
                      break;
                  case 19200:
                      cfsetispeed(&newtio, B19200);
                      cfsetospeed(&newtio, B19200);
                      break;
                  case 38400:
                      cfsetispeed(&newtio, B38400);
                      cfsetospeed(&newtio, B38400);
                      break;
                  case 57600:
                      cfsetispeed(&newtio, B57600);
                      cfsetospeed(&newtio, B57600);
                      break;
                  case 115200:
                      cfsetispeed(&newtio, B115200);
                      cfsetospeed(&newtio, B115200);
                      break;
                  case 230400:
                      cfsetispeed(&newtio, B230400);
                      cfsetospeed(&newtio, B230400);
                      break;
                  default:
                      printf("\tSorry, Unsupported baud rate, set default 9600!\n\n");
                      cfsetispeed(&newtio, B9600);
                      cfsetospeed(&newtio, B9600);
                      break;
              }
              // 設置read讀取最小字節數和超時時間
              newtio.c_cc[VTIME]=1;     // 讀取一個字符等待1(1/10)s
              newtio.c_cc[VMIN]=1;        // 讀取字符的最少個數為1
          
                tcflush(fd,TCIFLUSH);         //清空緩沖區
                if (tcsetattr(fd, TCSANOW, &newtio) !=0)    //激活新設置
                {
                  perror("SetupSerial 3");
                    return -1;
               }
                printf("Serial set done!\n");
              return 0;
          }
          
          /@brief 串口讀取函數
            @param[in]  fd         打開的串口文件句柄
            @param[in]  rcv_buf 接收緩存指針
            @param[in]  data_len    要讀取數據長度
            @param[in]  timeout     接收等待超時時間,單位ms
            @return     返回設置結果
            - >0      設置成功
            - 其他      讀取超時或錯誤
           /
          int UART_Recv(int fd, char rcv_buf, int data_len, int timeout)
          {
              int len, fs_sel;
              fd_set fs_read;
              struct timeval time;
          
              time.tv_sec=timeout / 1000;              //set the rcv wait time
              time.tv_usec=timeout % 1000  1000;    //100000us=0.1s
          
              FD_ZERO(&fs_read);        //每次循環都要清空集合,否則不能檢測描述符變化
              FD_SET(fd, &fs_read);    //添加描述符
          
              // 超時等待讀變化,>0:就緒描述字的正數目, -1:出錯, 0 :超時
              fs_sel=select(fd + 1, &fs_read, NULL, NULL, &time);
          //    printf("fs_sel=%d\n", fs_sel);
              if(fs_sel)
              {
                  len=read(fd, rcv_buf, data_len);
                  return len;
              }
              else
              {
          //        printf("Sorry,I am wrong!");
                  return -1;
              }
          }
          
          /@brief 串口發送函數
            @param[in]  fd            打開的串口文件句柄
            @param[in]  send_buf     發送數據指針
            @param[in]  data_len     發送數據長度
            @return     返回結果
            - data_len    成功
            - -1            失敗
           /
          int UART_Send(int fd, char send_buf, int data_len)
          {
              ssize_t ret=0;
          
              ret=write(fd, send_buf, data_len);
              if (ret==data_len)
              {
                  printf("send data is %s\n", send_buf);
                  return ret;
              }
              else
              {
                  printf("write device error\n");
                  tcflush(fd,TCOFLUSH);
                  return -1;
              }
          }
          
          
          /@fn main
            @brief main入口函數
           /
          int main (int argc, char argv[])
          {
              int fdSerial;
          
              // 打開串口設備
              fdSerial=open(DEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
              if(fdSerial < 0)
              {
                  perror(DEV_NAME);
                  return -1;
              }
              // 設置串口阻塞, 0:阻塞, FNDELAY:非阻塞
              if (fcntl(fdSerial, F_SETFL, 0) < 0)    //阻塞,即使前面在open串口設備時設置的是非阻塞的
              {
                  printf("fcntl failed!\n");
              }
              else
              {
                  printf("fcntl=%d\n", fcntl(fdSerial, F_SETFL, 0));
              }
              if (isatty(fdSerial)==0)
              {
                  printf("standard input is not a terminal device\n");
                  close(fdSerial);
                  return -1;
              }
              else
              {
                  printf("is a tty success!\n");
              }
              printf("fd-open=%d\n", fdSerial);
          
          
              // 設置串口參數
              if (setOpt(fdSerial, 115200, 8, 'N', 1)==-1)    //設置8位數據位、1位停止位、無校驗
              {
                  fprintf(stderr, "Set opt Error\n");
                  close(fdSerial);
                  exit(1);
              }
          
              tcflush(fdSerial, TCIOFLUSH);    //清掉串口緩存
              fcntl(fdSerial, F_SETFL, 0);    //串口阻塞
          
          
              char rcv_buf[100];
              int len;
          
              while(1)    //循環讀取數據
              {
                  len=UART_Recv(fdSerial, rcv_buf, 99, 10000);
                  if(len > 0)
                  {
                      rcv_buf[len]='\0';
                      printf("receive data is %s\n", rcv_buf);
                      printf("len=%d\n", len);
                      UART_Send(fdSerial, rcv_buf, len);
                  }
                  else
                  {
          //            printf("cannot receive data\n");
                  }
                  usleep(100000);    //休眠100ms
              }
          }
          

          本文參考

          https://blog.csdn.net/luotuo28/article/details/125896180

          https://www.cnblogs.com/silencehuan/p/11103074.html

          文主要給大家分享網絡七層概念之應用層,前邊的章節已經給大家講述了鏈路層、物理層、網絡層、傳輸層等,歡迎學習嵌入式網絡編程的朋友關注、轉載和發表評論!

          (絕對的好文,建議先收藏和轉載!)

          本文的主要講述內容為:

          1應用層常用的協議

          1.1DNS

          1.2FTP

          1.3TFTP

          1.4TELNET

          1.5電子郵件

          1.6萬維網 WWW

          2 C/S 交互模型

          2.1C/S 概述

          2.2C/S 模型

          2.3C/S 特性

          2.4 常用網絡命令

          應用層位于 OSI 參考模型的最高層,它通過使用下面各層所提供的服務,直接向用戶提供服務,是計算機網絡與用戶之間的界面或接口。應用層由若干面向用戶提供服務的應用程序和支持應用程序的通 信組件組成。

          為了向用戶提供有效的網絡應用服務,應用層需要確立相互通信的應用程序或進程的有效性并提供 同步,需要提供應用程序或進程所需要的信息交換和遠程操作,需要建立錯誤恢復的機制以保證應用層 數據的一致性。應用層為各種實際應用所提供的這些通信支持服務統稱為應用服務組件(Application Service Element,簡稱 ASE)。

          7.1 應用層常用的協議

          7.1.1 DNS

          每個應用層協議都是為了解決某一類應用問題,而問題的解決又往往是通過位于不同主機中的 多個應用進程之間的通信和協同工作來完成的。應用層的具體內容就是規定應用進程在通信時所遵循的 協議。

          應用層的許多協議都是基于客戶服務器方式。

          一、域名系統概述

          許多應用層軟件經常直接使用域名系統 DNS (Domain Name System),但計算機的用戶只是間接而不是直接使用域名系統。

          因特網采用層次結構的命名樹作為主機的名字,并使用分布式的域名系統 DNS。

          名字到 IP 地址的解析是由若干個域名服務器程序完成的。域名服務器程序在專設的結點上運行,運行該程序的機器稱為域名服務器。

          二、因特網的域名結構

          因特網采用了層次樹狀結構的命名方法。 任何一個連接在因特網上的主機或路由器,都有一個唯一的層次結構的名字,即域名。

          域名的結構由若干個分量組成,各分量之間用點隔開:….三級域名.二級域名.頂級域名 各分量分別代表不同級別的域名.

          (1) 國家頂級域名 nTLD:如: .cn 表示中國,.us 表示美國,.uk 表示英國,等等。

          (2) 國際頂級域名 iTLD:采用.int。國際性的組織可在 .int 下注冊。

          (3) 通用頂級域名 gTLD:最早的頂級域名是:

          .com 表示公司企業

          .net 表示網絡服務機構

          .org 表示非贏利性組織

          .edu 表示教育機構(美國專用)

          .gov 表示政府部門(美國專用)

          .mil 表示軍事部門(美國專用)

          新增加了七個通用頂級域名 :.aero 用于航空運輸企業 .biz 用于公司和企業 .coop 用于合作團體 .info 適用于各種情況 .museum 用于博物館 .name 用于個人 .pro 用于會計、律師和醫師等自由職業者

          圖 7-1 域名結構

          三、用域名服務器進行域名解析

          授權域名服務器 :因特網允許各個單位根據具體情況將本單位的域名劃分為若干個域名服務器管轄區(zone),并在各管轄區中設置相應的授權域名服務器。

          遞歸查詢 :

          圖 7-2 遞歸查詢

          遞歸與迭代相結合的查詢 :

          圖 7-3 遞歸與迭代查詢

          名字的高速緩存:使用名字的高速緩存可優化查詢的開銷。 每個域名服務器都維護一個高速緩存, 存放最近用過的名字以及從何處獲得名字映射信息的記錄。

          7.1.2 FTP

          FTP(File Transfer Protocol, FTP)是 TCP/IP 網絡上兩臺計算機傳送文件的協議,FTP 是在 TCP/IP

          網絡和 INTERNET 上最早使用的協議之一,它屬于網絡協議組的應用層。FTP 客戶機可以給服務器發出命令來下載文件,上載文件,創建或改變服務器上的目錄。

          一、概述

          FTP 是一個 8 位的客戶端-服務器協議,能操作任何類型的文件而不需要進一步處理,就像 MIME 或

          Unencode 一樣。但是,FTP 有著極高的延時,這意味著,從開始請求到第一次接收需求數據之間的時間會非常長,并且不時的必需執行一些冗長的登陸進程。

          FTP 服務一般運行在 20 和 21 兩個端口。端口 20 用于在客戶端和服務器之間傳輸數據流,而端口

          21 用于傳輸控制流,并且是命令通向 ftp 服務器的進口。當數據通過數據流傳輸時,控制流處于空閑狀態。而當控制流空閑很長時間后,客戶端的防火墻會將其會話置為超時,這樣當大量數據通過防火墻 時,會產生一些問題。此時,雖然文件可以成功的傳輸,但因為控制會話會被防火墻斷開,傳輸會產生 一些錯誤。

          網絡環境下復制文件的復雜性:(1) 計算機存儲數據的格式不同。 (2) 文件的目錄結構和文件命名的規定不同。 (3) 對于相同的文件存取功能,操作系統使用的命令不同。 (4) 訪問控制方法不同。

          FTP 特點:文件傳送協議 FTP 只提供文件傳送的一些基本的服務,它使用 TCP 可靠的運輸服務;

          FTP 的主要功能是減少或消除在不同操作系統下處理文件的不兼容性; FTP 使用客戶服務器方式。

          二、FTP 的基本工作原理

          主進程的工作步驟如下:打開熟知端口(端口號為 21),使客戶進程能夠連接上; 等待客戶進程發出連接請求; 啟動從屬進程來處理客戶進程發來的請求。從屬進程對客戶進程的請求處理完畢后即終止,但從屬進程在運行期間根據需要還可能創建其他一些子進程; 回到等待狀態,繼續接受其他客戶進程發來的請求,主進程與從屬進程的處理是并發地進行。

          兩個連接:控制連接在整個會話期間一直保持打開,FTP 客戶發出的傳送請求通過控制連接發送給服務器端的控制進程,但控制連接不用來傳送文件;實際用于傳輸文件的是"數據連接"。

          圖 7-4 FTP 使用的兩個 TCP 連接

          兩個不同的端口號 :當客戶進程向服務器進程發出建立連接請求時,要尋找連接服務器進程的熟知端口(21),同時還要告訴服務器進程自己的另一個端口號碼,用于建立數據傳送連接。 接著,服務器進程用自己傳送數據的熟知端口(20)與客戶進程所提供的端口號碼建立數據傳送連接。由于 FTP 使用了兩個不同的端口號,所以數據連接與控制連接不會發生混亂。

          使用兩個獨立的連接的主要好處是:使協議更加簡單和更容易實現; 在傳輸文件時還可以利用控制連接(例如,客戶發送請求終止傳輸)。

          NFS 采用另一種思路:NFS 允許應用進程打開一個遠地文件,并能在該文件的某一個特定的位置上開始讀寫數據。 NFS 可使用戶只復制一個大文件中的一個很小的片段,而不需要復制整個大文件。

          7.1.3 TFTP

          一、概述

          TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是 TCP/IP 協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。端口號為 69。

          TFTP 是一個傳輸文件的簡單協議,它基于 UDP 協議而實現,但是我們也不能確定有些 TFTP 協議是基于其它傳輸協議完成的。此協議設計的時候是進行小文件傳輸的。因此它不具備通常的 FTP 的許多功能,它只能從文件服務器上獲得或寫入文件,不能列出目錄,不進行認證,它傳輸 8 位數據。傳輸中有三種模式:netascii,這是 8 位的 ASCII 碼形式,另一種是 octet,這是 8 位源數據類型;最后一種 mail 已經不再支持,它將返回的數據直接返回給用戶而不是保存為文件。

          TFTP 是一個很小且易于實現的文件傳送協議。 TFTP 使用客戶服務器方式和使用 UDP 數據報,因此 TFTP 需要有自己的差錯改正措施。 TFTP 只支持文件傳輸而不支持交互。 TFTP 沒有一個龐大的命令集,沒有列目錄的功能,也不能對用戶進行身份鑒別。

          主要特點:(1) 每次傳送的數據 PDU 中有 512 字節的數據,但最后一次可不足 512 字節。(2) 數據 PDU 也稱為文件塊(block),每個塊按序編號,從 1 開始。 (3) 支持 ASCII 碼或二進制傳送。 (4) 可對文件進行讀或寫。 (5) 使用很簡單的首部。

          二、 與其它協議的聯系

          因為 TFTP 使用 UDP,而 UDP 使用 IP,IP 可以還使用其它本地通信方法。因此一個 TFTP 包中會有以下幾段:本地媒介頭,IP 頭,數據報頭,TFTP 頭,剩下的就是 TFTP 數據了。TFTP 在 IP 頭中不指定任何數據,但是它使用 UDP 中的源和目標端口以及包長度域。由 TFTP 使用的包標記(TID)在這里被用做端口,因此 TID 必須介于 0 到 65,535 之間。對它的初始化我們在后面討論。TFTP 頭中包括兩上字節的操作碼,這個碼指出了包的類型下面我們看看大體上的 TFTP 包格式,相關的內容我們在后面的章節中進行討論。

          ---------------------------------------------------

          | Local Medium | Internet | Datagram | TFTP |

          ---------------------------------------------------

          三、 初始連接

          初始連接時候需要發出 WRQ(請求寫入遠程系統)或 RRQ( 請求讀取遠程系統),收到一個確定應答,一個確定可以寫出的包或應該讀取的第一塊數據。通常確認包包括要確認的包的包號, 每個數據包都與一個塊號相對應, 塊號從 1 開始而且是連續的。因此對于寫入請求的確定是一個比較特殊的情況,因此它的包的包號是 0。如果收到的包是一個錯誤的包,則這個請求被拒絕。創建連接時,通信雙方隨機選擇一個 TID, 因此是隨機選擇的,因此兩次選擇同一個 ID 的可能性就很小了。每個包包括兩個 TID, 發送者 ID 和接收者 ID。這些 ID 用于在 UDP 通信時選擇端口,請求主機選擇 ID 的方法上面已經說過了,在第一次請求的時候它會將請求發到 TID 69,也就是服務器的 69 端口上。應答時,服務器使用一個選擇好的 TID 作為源 TID, 并用上一個包中的 TID 作為目的 ID 進行發送。這兩個被選擇的 ID 在隨后的通信中會被一直使用。下例是一個寫入的例子,其中 WRQ,ACK 和 DATA 代表寫入請求,確認和數據。

          四、 TFTP 支持五種類型的包

          opcode operation 1.Read

          request (RRQ) 2.Write

          request (WRQ) 3.Data

          (DATA) 4.Acknowledgment

          (ACK) 5.Error (ERROR)

          包頭中包括了這個包所指定的操作碼。

          1. bytes string 1 byte string 1 byte

          ------------------------------------------------

          | Opcode | Filename | 0 | Mode | 0 |

          ------------------------------------------------

          RRQ/WRQ 包RRQ 和 WRQ 包(代碼分別為 1 和 2)的格式如上所示。文件名是 NETASCII 碼字符,以 0 結束。而MODE 域包括了字符串"netascii","octet"或"mail",名稱不分大小寫。接收到 NETASCII 格式數據的主機必須將數據轉換為本地格式。OCTET 模式用于傳輸文件,這種文件在源機上以 8 位格式存儲。假設每個機器都存在一個 8 位的格式,這樣的假設是最一般的。比如 DEC-20,這是一種 36 位機,我們可以假設它是 4 個 8 位外加另外 4 位而構成。如果機器收到 OCTET 格式文件,返回時必須與原來文件完全一樣。在使用 MAIL 模式時,用戶可以在 FILE 處使用接收人地址,這個地址可以是用戶名或用戶名@主機的形式,如果是后一種形式,允許主機使用電子郵件傳輸此文件。如果使用 MAIL 類型,包必須以 WRQ 開始,否則它與 NETASCII 完全一樣。我們的討論建立在發送方和接收方都在相同模式的情況下,但是雙方可以以不同的模式進行傳輸。例如一個機器可以是一臺存儲服務器,這樣一臺服務器需要將NETASCII 格式轉換為自己的格式。另外,我們可以設想 DEC-20 這種機器,它使用 36 位字長,用戶這邊可以使用特殊的機制一次讀取 36 位,而服務器卻可以仍然使用 8 位格式。在這兩種情況下,我們看到了兩臺機器使用不同格式的情況。可以在兩臺主機間定義其它的傳輸方式,但是定義要小心,因為這 種傳輸方式不為人知,而且也沒有權威機構為其指定名稱或定義它的模式。

          2. bytes 2 bytes n bytes

          ----------------------------------

          | Opcode | Block # | Data |

          ----------------------------------

          DATA 包

          數據在數據包中傳輸,其格式如上圖所示。數據包的 OP 碼為 3,它還包括有一個數據塊號和數據。數據塊號域從 1 開始編碼,每個數據塊加 1,這樣接收方可以確定這個包是新數據還是已經接收過的數據。數據域從 0 字節到 512 字節。如果數據域是 512 字節則它不是最后一個包,如果小于 512 字節則表示這個包是最后一個包。除了 ACK 和用于中斷的包外,其它的包均得到確認。發出新的數據包等于確認上次的包。WRQ 和 DATA 包由 ACK 或 ERROR 數據包確認,而 RRQ 數據包由 DATA 或 ERROR 數據包確認。下圖即是一個 ACK 包,操作碼為 4。其中的包號為要確認的數據包的包號。

          3. bytes 2 bytes

          ---------------------

          | Opcode | Block # |

          ---------------------

          ACK 包

          WRQ 數據包被 ACK 數據包確認,WRQ 數據包的包號為 0。4.bytes 2 bytes string 1 byte

          -----------------------------------------

          | Opcode | ErrorCode | ErrMsg | 0 |

          -----------------------------------------

          ERROR 包

          一個 ERROR 包,它的操作碼是 5,它的格式如上所示。此包可以被其它任何類型的包確認。錯誤碼指定錯誤的類型。錯誤的值和錯誤的意義在附錄中。錯誤信息是供程序員使用的。

          圖 7-5 TFTP 的五種協議數據單元 PDU

          7.1.4 TELNET

          一、概述

          Telnet 協議是 TCP/IP 協議族中的一員,是 Internet 遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用 telnet 程序,用它連接到服務器。終端使用者可以在 telnet 程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制臺上輸入一樣。可以在本地就能控制服務器。要開始一個 telnet 會話,必須輸入用戶名和密碼來登錄服務器。Telnet 是常用的遠程控制 Web 服務器的方法。

          它最初是由 ARPANET 開發的,但是現在它主要用于 Internet 會話。它的基本功能是,允許用戶登錄進入遠程主機系統。起初,它只是讓用戶的本地計算機與遠程計算機連接,從而成為遠程主機的一個 終端。它的一些較新的版本在本地執行更多的處理,于是可以提供更好的響應,并且減少了通過鏈路發 送到遠程主機的信息數量。

          Telnet 是位于 OSI 模型的第 7 層---應用層上的一種協議,是一個通過創建虛擬終端提供連接到遠程主機終端仿真的 TCP/IP 協議。這一協議需要通過用戶名和口令進行認證,是 Internet 遠程登陸服務的標準協議。應用 Telnet 協議能夠把本地用戶所使用的計算機變成遠程主機系統的一個終端。它提供了三種基本服務:

          1) Telnet 定義一個網絡虛擬終端為遠程系統提供一個標準接口。客戶機程序不必詳細了解遠程系統,他們只需構造使用標準接口的程序;

          2) Telnet 包括一個允許客戶機和服務器協商選項的機制,而且它還提供一組標準選項; .

          3) Telnet 對稱處理連接的兩端,即 Telnet 不強迫客戶機從鍵盤輸入,也不強迫客戶機在屏幕上顯示輸出。

          二、適應異構

          為了使多個操作系統間的 Telnet 交互操作成為可能,就必須詳細了解異構計算機和操作系統。比如,一些操作系統需要每行文本用 ASCII 回車控制符(CR)結束,另一些系統則需要使用 ASCII 換行符

          (LF),還有一些系統需要用兩個字符的序列回車-換行(CR-LF);再比如,大多數操作系統為用戶提供了一個中斷程序運行的快捷鍵,但這個快捷鍵在各個系統中有可能不同(一些系統使用 CTRL+C,而另一些系統使用 ESCAPE)。如果不考慮系統間的異構性,那么在本地發出的字符或命令,傳送到遠地并被遠程系統解釋后很可能會不準確或者出現錯誤。因此,Telnet 協議必須解決這個問題。 為了適應異構環境,Telnet 協議定義了數據和命令在 Internet 上的傳輸方式,此定義被稱作網絡虛擬終端 NVT(Net Virtual Terminal)。它的應用過程如下: 對于發送的數據:客戶機軟件把來自用戶終端的按鍵和命令序列轉換為 NVT 格式,并發送到服務器,服務器軟件將收到的數據和命令,從 NVT 格式轉換為遠地系統需要的格式; 對于返回的數據:遠地服務器將數據從遠地機器的格式轉換為 NVT 格式,而本地客戶機將將接收到的 NVT 格式數據再轉換為本地的格式。 對于 NVT 格式的詳細定義,有興趣的朋友可以去查找相關資料。

          三、傳送遠程命令

          我們知道絕大多數操作系統都提供各種快捷鍵來實現相應的控制命令,當用戶在本地終端鍵入這些快捷鍵的時候,本地系統將執行相應的控制命令,而不把這些快捷鍵作為輸入。那么對于 Telnet 來說, 它是用什么來實現控制命令的遠程傳送呢? Telnet 同樣使用 NVT 來定義如何從客戶機將控制功能傳送到服務器。我們知道 USASCII 字符集包括 95 個可打印字符和 33 個控制碼。當用戶從本地鍵入普通字符時,NVT 將按照其原始含義傳送;當用戶鍵入快捷鍵(組合鍵)時,NVT 將把它轉化為特殊的 ASCII 字符在網絡上傳送,并在其到達遠地機器后轉化為相應的控制命令。

          將正常 ASCII 字符集與控制命令區分的原因:

          1)這種區分意味著 Telnet 具有更大的靈活性:它可在客戶機與服務器間傳送所有可能的 ASCII字符以及所有控制功能;

          2) 這種區分使得客戶機可以無二義性的指定信令,而不會產生控制功能與普通字符的混亂。

          四、數據流向

          上面我們提到過將 Telnet 設計為應用級軟件有一個缺點,那就是:效率不高。這是為什么呢?下面給出 Telnet 中的數據流向:

          數據信息被用戶從本地鍵盤鍵入并通過操作系統傳到客戶機程序,客戶機程序將其處理后返回操作系統,并由操作系統經過網絡傳送到遠程機器,遠程操作系統將所接收數據傳給服務器程序,并經服務器程序再次處理后返回到操作系統上的偽終端入口點,最后,遠程操作系統將數據傳送到用戶正在運行的應用程序,這便是一次完整的輸入過程;輸出將按照同一通路從服務器傳送到客戶機。 因為每一次的輸入和輸出,計算機將切換進程環境好幾次,這個開銷是很昂貴的。還好用戶的鍵入速率并不算高, 這個缺點我們仍然能夠接受。

          五、 強制命令

          我們應該考慮到這樣一種情況:假設本地用戶運行了遠地機器的一個無休止循環的錯誤命令或程序,且此命令或程序已經停止讀取輸入,那么操作系統的緩沖區可能因此而被占滿,如果這樣,遠程服 務器也無法再將數據寫入偽終端,并且最終導致停止從 TCP 連接讀取數據,TCP 連接的緩沖區最終也會被占滿,從而導致阻止數據流流入此連接。如果以上事情真的發生了,那么本地用戶將失去對遠程機器的控制。

          為了解決此問題,Telnet 協議必須使用外帶信令以便強制服務器讀取一個控制命令。我們知道 TCP 用緊急數據機制實現外帶數據信令,那么 Telnet 只要再附加一個被稱為數據標記(date mark)的保留八位組,并通過讓 TCP 發送已設置緊急數據比特的報文段通知服務器便可以了,攜帶緊急數據的報文段將繞過流量控制直接到達服務器。作為對緊急信令的相應,服務器將讀取并拋棄所有數據,直到找到了一 個數據標記。服務器在遇到了數據標記后將返回正常的處理過程。

          六、 選項協商

          由于 Telnet 兩端的機器和操作系統的異構性,使得 Telnet 不可能也不應該嚴格規定每一個 telnet 連接的詳細配置,否則將大大影響 Telnet 可適應異構性。因此,Telnet 采用選項協商機制來解決這一問題。

          Telnet 選項的范圍很廣:一些選項擴充了大方向的功能,而一些選項制涉及一些微小細節。例如: 有一個選項可以控制 Telnet 是在半雙工還是全雙工模式下工作(大方向);還有一個選項允許遠地機器上的服務器決定用戶終端類型(小細節)。

          Telnet 選項的協商方式也很有意思,它對于每個選項的處理都是對稱的,即任何一端都可以發出協商申請;任何一端都可以接受或拒絕這個申請。另外,如果一端試圖協商另一端不了解的選項,接受請求的一端可簡單的拒絕協商。因此,有可能將更新,更復雜的 Telnet 客戶機服務器版本與較老的, 不太復雜的版本進行交互操作。如果客戶機和服務器都理解新的選項,可能會對交互有所改善。否則, 它們將一起轉到效率較低但可工作的方式下運行。所有的這些設計,都是為了增強適應異構性,可見

          Telnet 的適應異構性對其的應用和發展是多么重要。

          7.1.5 電子郵件

          一、概述

          電子郵件(e-mail)是因特網上使用得最多的和最受用戶歡迎的一種應用。電子郵件把郵件發送到

          ISP 的郵件服務器,并放在其中的收信人郵箱中,收信人可隨時上網到 ISP 的郵件服務器進行讀取。電子郵件不僅使用方便,而且還具有傳遞迅速和費用低廉的優點。 現在電子郵件不僅可傳送文字信息, 而且還可附上聲音和圖像。

          在 1982 年制定出簡單郵件傳送協議 SMTP (Simple Mail Transfer Protocol) 和因特網文本報文格式,它們都已成為因特網的正式標準、1993 年提出了通用因特網郵件擴充 MIME (Multipurpose Internet Mail Extensions)。

          電子郵件的最主要的組成構件 :

          圖 7-6 電子郵件的組成構件

          應當注意:一個郵件服務器既可以作為客戶,也可以作為服務器。

          電子郵件的發送和接收過程 :(1) 發信人調用用戶代理來編輯要發送的郵件。(2)發送端郵件服務器將郵件放入 郵件緩存隊列中,等待發送。(3) 運行在發送端郵件服務器的 SMTP 客戶進程,發現 在郵件緩存中有待發送的郵件,就向運行在接收端郵件 服務器的 SMTP 服務器進程發起 TCP 連接的建立。(4) TCP 連接建立后,SMTP 客戶進程開始向遠程的 SMTP 服務器進程發送郵件。當所有的待發送郵件發完了,SMTP 就關閉所建立的 TCP 連接。(5) 運行在接收端郵件服務器中的 SMTP 服務器進程收到郵件后,將郵件放入收信人的用戶郵箱中,等待收信人在方便時進行讀取。(6) 收信人在打算收信時, 調用用戶代理,使用 POP3(或 IMAP)協議將自己的郵件從接收端郵件服務器的用戶郵箱中的取回(如果郵箱中有來信的話)。

          電子郵件由信封(envelope)和內容(content)兩部分組成。

          TCP/IP 體系的電子郵件系統規定電子郵件地址的格式如下:收信人郵箱名@郵箱所在主機的域名。

          二、簡單郵件傳送協議 SMTP

          SMTP 所規定的就是在兩個相互通信的 SMTP 進程之間應如何交換信息。由于 SMTP 使用客戶服務器方式,因此負責發送郵件的 SMTP 進程就是 SMTP 客戶,而負責接收郵件的 SMTP 進程就是 SMTP 服務器。

          SMTP 通信的三個階段 :連接建立、郵件傳送、連接釋放。

          三、電子郵件的信息格式

          一個電子郵件分為信封和內容兩大部分。[RFC 822]只規定了郵件內容中的首部(header)格式,而對郵件的主體(body)部分則讓用戶自由撰寫。

          四、郵件讀取協議 POP3 和 IMAP

          郵局協議 POP 是一個非常簡單、但功能有限的郵件讀取協議,現在使用的是它的第三個版本 POP3。

          POP 也使用客戶服務器的工作方式。

          IMAP 也是按客戶服務器方式工作,現在較新的版本是 IMAP4。 用戶在自己的 PC 機上就可以操縱

          ISP 的郵件服務器的郵箱,就像在本地操縱一樣。 因此 IMAP 是一個聯機協議。

          IMAP 最大的好處就是用戶可以在不同的地方使用不同的計算機隨時上網閱讀和處理自己的郵件。

          IMAP 還允許收信人只讀取郵件中的某一個部分。

          IMAP 的缺點是如果用戶沒有將郵件復制到自己的 PC 機上,則郵件一直是存放在 IMAP 服務器上。因此用戶需要經常與 IMAP 服務器建立連接。

          五、通用因特網郵件擴充 MIME

          SMTP 有以下缺點:SMTP 不能傳送可執行文件或其他的二進制對象;SMTP 限于傳送 7 位的 ASCII 碼;SMTP 服務器會拒絕超過一定長度的郵件;某些 SMTP 的實現并沒有完全按照[RFC 821]的 SMTP 標準。

          MIME 的特點:MIME 并沒有改動 SMTP 或取代它;MIME 的意圖是繼續使用目前的[RFC 822]格式, 但增加了郵件主體的結構,并定義了傳送非 ASCII 碼的編碼規則。

          圖 7-7 MIME 和 SMTP 的關系 :


          7.1.6 萬維網 WWW

          一、概述

          萬維網 WWW (World Wide Web)并非某種特殊的計算機網絡。 萬維網是一個大規模的、聯機式的信息儲藏所。萬維網提供分布式服務 。

          圖 7-8 萬維網站點

          萬維網是分布式超媒體(hypermedia)系統,它是超文本(hypertext)系統的擴充。萬維網以客戶服務器方式工作。

          怎樣標志分布在整個因特網上的萬維網文檔? 使用統一資源定位符 URL (Uniform Resource

          Locator)來標志萬維網上的各種文檔。 使每一個文檔在整個因特網的范圍內具有唯一的標識符 URL。用何協議實現萬維網上各種超鏈的鏈接? 在萬維網客戶程序與萬維網服務器程序之間進行交互所

          使用的協議,是超文本傳送協議 HTTP (HyperText Transfer Protocol)。

          怎樣使各種萬維網文檔都能在因特網上的各種計算機上顯示出來,同時使用戶清楚地知道在什么地 方存在著超鏈? 超文本標記語言 HTML (HyperText Markup Language)使得萬維網頁面的設計者可以很方便地用一個超鏈從本頁面的某處鏈接到因特網上的任何一個萬維網頁面,并且能夠在自己的計算機屏 幕上將這些頁面顯示出來。

          怎樣使用戶能夠很方便地找到所需的信息? 為了在萬維網上方便地查找信息,用戶可使用各種的搜索工具(即搜索引擎)。

          二、統一資源定位符 URL

          統一資源定位符 URL 是對可以從因特網上得到的資源的位置和訪問方法的一種簡潔的表示。 URL 給資源的位置提供一種抽象的識別方法,并用這種方法給資源定位。 只要能夠對資源定位,系統就可以對資源進行各種操作,如存取、更新、替換和查找其屬性。 URL 相當于一個文件名在網絡范圍的擴展。

          URL 的一般形式是:<URL 的訪問方式>://<主機>:<端口>/<路徑>

          三、超文本傳送協議 HTTP

          萬維網的工作過程 :

          圖 7-9 HTTP 協議

          HTTP 的主要特點 : 是面向事務的客戶服務器協議;HTTP 1.0 協議是無狀態的;協議本身也是無連接的。

          萬維網高速緩存 (Web cache) :萬維網高速緩存代表瀏覽器發出 HTTP 請求,因此又稱為代理服務器(proxy server)。 萬維網高速緩存將最近的一些請求和響應暫存在本地磁盤中。 使用高速緩存可減少 訪問因特網服務器的時延。

          HTTP 有兩類報文:請求報文、響應報文

          四、超文本標記語言 HTML

          HTML 定義了許多用于排版的命令(標簽)。 HTML 把各種標簽嵌入到萬維網的頁面中。這樣就構成了所謂的 HTML 文檔。HTML 文檔是一種可以用任何文本編輯器創建的 ASCII 碼文件。

          僅當 HTML 文檔是以.html 或 .htm 為后綴時,瀏覽器才對此 文檔的各種標簽進行解釋。

          元素(element)是 HTML 文檔結構的基本組成部分。一個 HTML 文檔本身就是一個元素。每個 HTML 文檔由兩個主要元素組成:首部(head)和主體(body) 。文檔的主體是 HTML 文檔的最主要的部分。

          HTML 用一對標簽(即一個開始標簽和一個結束標簽)或幾對標簽來標識一個元素。 開始標簽由一個小于字符"<"、一個標簽名、和一個大于字符">"組成。 結束標簽和開始標簽的區別只是在小于字符的后面要加上一個斜線字符"/"。 雖然標簽名并不區分大寫和小寫。 有一些標簽可以將結束標簽省略。

          五、萬維網頁面中的超鏈

          定義一個超鏈的標簽是<A>。字符 A 表示錨(Anchor)。

          在 HTML 文檔中定義一個超鏈的語法是: <A HREF="... ">X</A>

          六、動態萬維網文檔與 CGI 技術

          靜態文檔是指該文檔創作完畢后就存放在萬維網服務器中,在被用戶瀏覽的過程中,內容不會改變。 動態文檔是指文檔的內容是在瀏覽器訪問萬維網服務器時才由應用程序動態創建。 動態文檔和靜態文檔之間的主要差別體現在服務器一端。

          萬維網服務器功能的擴充 :(1) 應增加另一個應用程序,用來處理瀏覽器發來的數據,并創建動態文檔。(2) 應增加一個機制,用來使萬維網服務器把瀏覽器發來的數據傳送給這個應用程序,然后萬維網服務器能夠解釋這個應用程序的輸出,并向瀏覽器返回 HTML 文檔。

          圖 7-10 CGI

          CGI 是一種標準,它定義了動態文檔應如何創建,輸入數據應如何提供給應用程序,以及輸出結果應如何使用。 萬維網服務器與 CG I 的通信遵循 CGI 標準。

          7.2 C/S 交互模型

          7.2.1 C/S 概述

          C/S 又稱 Client/Server 或客戶/服務器模式。C/S 型數據庫應用程序由兩部分組成:服務器和客戶機。服務器指數據庫管理系統(Database Manage System,簡稱 DBMS),用于描述、管理和維護數據庫的程序系統,是數據庫系統核心組成部分,對數據庫進行統一的管理和控制。客戶機則將用戶的需求 送交到服務器,再從服務器返回數據給用戶。

          C/S 型數據庫非常適合于網絡應用,可以同時被多個用戶所訪問,并賦予不同的用戶以不同的安全權限。C/S 型數據庫支持的數據量一般比文件型數據庫大得多,還支持分布式的數據庫(即同一數據庫位于多臺服務器上)。同時,C/S 型數據庫一般都能完善地支持 SQL 語言(所以也被稱做 SQL 數據庫)。這些特性決定了 C/S 型數據庫適合于高端應用。

          常見的 C/S 型數據庫有著名的 Oracle,Sybase,Informix,微軟的 Microsoft SQL server,IEM 的 DB2,以及 Delphi 自帶的 InterBase 等。

          C/S 的優點是能充分發揮客戶端PC的處理能力,很多工作可以在客戶端處理后再提交給服務器, 對應的優點就是客戶端響應速度快。缺點主要有以下幾個:

          · 只適用于局域網。而隨著互聯網的飛速發展,移動辦公和分布式辦公越來越普及,這就需要系 統具有擴展性。

          · 客戶端需要安裝專用的客戶端軟件。首先涉及到安裝的工作量,其次任何一臺電腦出現問題(如病毒、硬件損壞),都需要進行安裝或維護。另外,系統軟件升級時,每一臺客戶機需要重新安裝,其維護和升級成本非常高。

          對客戶端的操作系統一般也會有限制。可能適應于 Win98,但不能用于 Win2000 或 Windows XP。或者不適用于微軟新的操作系統等,更不用說 Linux、UNIX 了。

          7.2.2 C/S 模型

          應用程序之間為了能順利地進行通信,一方通常需要處于守候狀態,等待另一方請求的到來。 在分布式計算中,一個應用程序被動地等待,而另一個應用程序通過請求啟動通信的模式就是客戶/服務器模式。

          客戶(Client)和服務器(Server)分別是指兩個應用程序。客戶向服務器發出服務請求,服 務器對客戶的請求作出響應。如下圖所示為一個通過互聯網進行交互的客戶/服務器模型。在圖9.1 中,服務器處于守候狀態,并監視客戶端的請求。客戶端發出請求,并請求經互聯網傳輸給服務器。一旦服務器接收到這個請求,就可以執行請求所指定的任務,并將執行的結果經互聯網回送 給客戶。

          圖 7-11 C/S 交互模型

          7.2.3 C/S 特性

          一臺主機上通常可以運行多個服務器程序,每個服務器程序需要并發地處理多個客戶的請求, 并將處理的結果返回給客戶。在下圖中,運行服務器程序的主機同時提供 Web 服務、FTP 服務和文件服務。由于客戶 1、客戶 2 和客戶 3 分別運行訪問文件服務和 Web 服務的客戶端程序,因此,通過互聯網,客戶 1 可以訪問運行文件服務主機上的文件系統,而 Web 服務器程序根據客戶 2 和客戶

          3 的請求,同時為他們提供服務。

          圖 7-12 并發服務器

          在互連網絡中,客戶發起請求完全是隨機的,可能出現多個請求同時到達服務器的情況。因此,服務器 必須具備處理多個并發請求的能力,服務器有兩種實現方案。

          (1)重復服務器(Iterative Server)方案

          服務器程序中包含一個請求隊列,客戶請求到達后,首先進入隊列中等待,服務器按照先進先出的 原則順序作出響應。

          (2)并發服務器(Concurrent Server)方案

          并發服務器是一個守護進程,在沒有請求到達時它處于等待狀態。一旦客戶請求到達,服務器立即 再為之創建一個子進程,然后回到等待狀態,由子進程響應請求。當下一個子進程到達時,服務器 再為之創建一個子進程。其中,并發服務器叫做主服務器,子進程叫做從服務器。

          7.3 常用網絡命令

          Linux 作為一個基于網絡的操作系統,它提供了很多網絡調試程序,這些程序由 net-tools 包或單獨的安裝包中提供。

          常用網絡命令:

          · ping 一 發送一個ICMP ECHO_REQUEST到目的主機,通常用來測試網絡聯通狀況

          · traceroute 一 搜尋一個主機到另一個手機之間經歷的路由器

          · ifconfig 一 查看和修改網絡接口配置信息

          · route 一 查看和修改路由表

          · netstat 一 查看網絡連接信息

          · host,dig,nslookup — dns查詢命令

          · whois — whois目錄服務客戶端

          · iptables 一 配置主機包過濾器和Nat透明代理

          · arp 一 查看和修改系統arp緩存

          · arping 一 發送arp廣播,并顯示回應信息

          · ssh 一 安全遠程login客戶端,使用ssl通訊

          · sftp 一 安全文件傳輸,使用ssl

          · ftp 一 文件傳輸程序

          · tftp 一簡單的文件傳輸程序,使用udp協議

          · telnet 一遠程login客戶端

          下面將介紹上面列出的部分網絡命令的使用方法: ifconfig

          ifconfig 程序用來配置網絡接口,它可以用來設置網絡接口的 lP 地址,子網掩碼,廣播地址,以太網地址等等。同時它也能列表網絡接口的配置信息,如使用-a 參數。

          ifconfig 有著復雜的參數列表,這里并不詳細敘述每個參數的使用方法,下面僅給出一些使用

          ifconfig 命令的的實例:

          · ifconfig eth0 down 關閉eth0網絡接口

          · ifconfig eth0 up 啟用eth0網絡接口

          · ifconfig eth0 arp 啟用eth0接口的arp能力

          · ifconfig eth0 -arp 關閉eth0接口的arp能力

          · ifconfig eth0 netmask 255.255.255.0 設置eth0接口的子網掩碼為255.255.255.0

          · ifconfig eth0 192.168.2.12 設置eth0接口IP地址為l92.168.2.12

          · ifconfig eth0.broadcast l92.168.2.255 將第一塊網卡的廣播地址設置為

          · 192.168.2.255,

          · ifconfig 列出接口信息這些參數可以組合使用如:

          · ifconfig eth0 192.168.2.12 netmask 255.255.255.0

          route

          route 命令是用來查看和設置系統的路由信息,以實現與其他網絡或主機的通訊。

          · route 羅列出當前路由表所有條目

          · route add default gw l92.168.0.254 設置默認路由為192.168.0.254

          · route del l92.168.3.19 刪除路由表中到指定主機或網路的條目

          ping

          ping 是一個最常用的檢測是否能夠與遠端機器建立網絡通訊連接的命令。它是通過 Internet 控制報文協議 ICMP 的回射請求命令實現的。同樣的,在此不羅列 ping 命令的所有可選參數,舉例說明 ping 的常見用法:

          · ping 192.168.2.1 檢測本機到192.168.2.1的連通性。

          · ping www.google.cn檢測本機到www.google.cn的連通性

          · ping -c 4 192.168.2.1 在Linux下,如果你不指定-c參數,ping命令將一直不斷地向遠 方機器發送ICMP信息。可以通過-c參數來指定發送ICMP的數量。

          · ping -I eth0 l92.168.0.1 有時,我們需要檢測系統的某個接口能否連接到遠程系統, 需要在執行ping命令時用-I參數指出接口名

          traceroute

          當不能成功連接至遠程主機時,traceroute 可以幫助找到在哪里出了問題,或者你想知道你的信息到遠方機器都經過了哪些路由器,可以使用 traceroute 命令。

          Traceroute www.google.cn 查詢主機到 www.google.cn 中途經歷了哪幾個路由器。

          netstat

          在Linux 系統中,netstat 是一個功能十分強大的查看網絡狀態的工具。同樣,我們只是列出netstat的常見用法:

          · netstat -i 這個命令將輸出所有網絡接口信息的統計表,其中包括:

          · lface:網絡接口名

          · MTU:最大傳輸單元

          · RX-OK:共成功接收多少個包

          · RX-ERR:接收的包中共有多少個錯誤包

          · RX-DRP:接收時共丟失多少個包

          · RX-OVR:共接收了多少個沖突包

          · TX-OK:共成功發送多少個包

          · TX-ERR:發送的包中共有多少個錯誤包

          · TX-DRP:共丟失多少個包

          · TX-OVR:共接收了多少個沖突的包

          · netstat -s 顯示網絡的統計信息,使用這個命令,將會以摘要的形式統計出 IP、ICMP、TCP、UDP、

          TCPEXT 形式的通信信息。

          · netstat_-an 顯示本機的所有連接信息。

          · netstat -r 顯示路由衷,輸出與 route 命令的格式相同。

          arp

          在 IP 協議中 arp 協議用來查詢子網中某個 IP 地址其對應的以太網地址,它通過發送以太網廣播的方式發送查詢信息,并獲取對方的應答,除了查詢方式,還有一種獲取 arp 信息的手段,通常一臺主機修改了本地接口的 I P 地址會主動以以太網廣播的形式發送 arp 聯編信息,以更新其他主機的 arp 條目。

          arp 命令是用來查看和修改本地緩存的 arp 路由信息,下-面列舉幾個常見的 arp 命令用法:

          · arp -a 顯示本地 arp 條目

          · arp -s l92.168.2.12 2a:4d:00:25:e0:3f 手動添加一條靜態的 arp 條目,所謂靜態,就是該信息不會被收到的動態地址聯編信息所改變,該對應關系將一直保持到系統重啟。

          · arp -d l92.168.2.12 手動刪除一個 arp 條目。


          主站蜘蛛池模板: 久久久久国产一区二区三区| 合区精品久久久中文字幕一区 | 国产a久久精品一区二区三区| 亚洲成人一区二区| 国产精品一区二区久久乐下载| 精品一区狼人国产在线| 一区二区三区四区在线观看视频 | 亚洲一区无码中文字幕| 国产AV国片精品一区二区| 精品一区二区三区在线视频| 99精品国产一区二区三区不卡 | 无码精品不卡一区二区三区| 亚洲av区一区二区三| 日本一区二区三区精品中文字幕 | 精品一区二区三区东京热| 少妇激情AV一区二区三区| 无码一区二区三区爆白浆| 武侠古典一区二区三区中文| 国产在线观看精品一区二区三区91| 精品国产一区二区三区四区| 日本福利一区二区| 国产成人无码一区二区在线观看| 亚洲一区二区三区精品视频| 一区二区在线免费视频| 亚洲国产美女福利直播秀一区二区| 国产在线步兵一区二区三区| 无码人妻精品一区二区三区66 | 亚洲AV日韩AV一区二区三曲| 自慰无码一区二区三区| 韩国一区二区三区| 亚洲乱码av中文一区二区| 无码一区二区三区老色鬼| 一区二区三区www| 成人精品一区二区三区校园激情| 亚洲成AV人片一区二区| 国产成人综合亚洲一区| 日本一区二三区好的精华液| 欧洲精品无码一区二区三区在线播放 | 国产精品熟女视频一区二区| 国产一区二区在线观看app| 午夜DV内射一区区|