Linux組網技術與網絡通信編程_第1頁
Linux組網技術與網絡通信編程_第2頁
Linux組網技術與網絡通信編程_第3頁
Linux組網技術與網絡通信編程_第4頁
Linux組網技術與網絡通信編程_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1Linux 組網技術與網絡通信編程組網技術與網絡通信編程計算機系99級研究生陳毅東2Linux 組網技術與網絡通信編程組網技術與網絡通信編程 Linux概述概述 Linux的安裝的安裝 Linux中中Internet服務的配置服務的配置 Linux編程環境簡介編程環境簡介 Linux上上Socket編程及實例編程及實例結束3Linux概述概述 Linux是什么是什么 Linux的發展歷史的發展歷史 Linux與與UNIX的關系的關系 Linux的版本號介紹的版本號介紹返回4Linux是什么是什么Linux是一個遵循POSIX標準的免費操作系統,具有BSD和System V的擴展特性。它版權所

2、有者是芬蘭籍的Linus Benedict Torvalds先生和其他開發人員,并且遵循GPL聲明。返回5Linux的發展歷史的發展歷史 1991年8月,來自芬蘭赫爾辛基大學的年輕人Linus Benedict Torvalds,對外發表了一套全新的操作系統(Linux 0.01版)。 1991年10月5日,Linus發布了Linux的第一個“正式”版本,即0.02版。在Linux上可以運行bash,GCC。最早Linux被放置在一個FTP服務器上供大家自由下載,FTP管理員認為這是Linus的Minix,因而就建立了一個Linux目錄來存放這些文件,于是Linux這個名字就傳開了,現在已經成

3、為約定俗成的名稱了。 1994年3月14日,Linux終于發布了它的第一個正式版本1.0版,而Linux的討論區也從原來的comp.os.minix中獨立成為alt.os.linux后來又更名為comp.os.Linux。返回6Linux與與UNIX的關系的關系 目前,UNIX有兩個大流派:那就是AT&T發布的UNIX操作系統System V與美國加州大學伯克利分校發布的UNIX版BSD(Berkeley Software Distribution)。SVR4是兩大流派融合后的產物。特性典型的SVRx典型的xBSD核心名稱/unix/vmunix (Linux)終端啟動文件/etc/i

4、nittab (Linux) /etc/ttys開機啟動文件/etc/rc.d目錄(Linux) /etc/rc.*文件掛上的FS/etc/mnttab/etc/mtab (Linux)常用的Shellsh , kshcsh程序對映/proc (SVR4和Linux)表1SVR系列和BSD系列的特性比較返回7Linux的版本號介紹的版本號介紹 內核版本指的是在Linus領導下的開發小組開發出的系統內核的版本號,例如:2.0.34和2.1.105等。(一般說來,以序號的第二位為偶數的版本表明這是一個可以使用的穩定版本,而序號的第二位奇數的版本一般有一些新的東西加入,是不一定很穩定的測試版本。)

5、一些組織或廠家將Linux系統內核與應用軟件和文檔包裝起來,并提供一些安裝界面和系統設定與管理工具,從而構成了一個發行套件。相對于內核版本,發行套件的版本號隨發布者的不同而不同,與系統內核的版本號是相對獨立的,例如Slackware 7.0,RedHat 7.0,TurboLinux 6.2,RedFlag 1.0等。返回8Linux的安裝的安裝 準備安裝準備安裝設置設置CMOS準備硬盤空間準備硬盤空間決定安裝方式并制作相應軟盤決定安裝方式并制作相應軟盤 安裝中的一些注意事項安裝中的一些注意事項硬盤的分區硬盤的分區配置配置TCP/IP安裝安裝LILO返回9設置設置CMOS 在CMOS中把Ant

6、i virus(防止病毒寫主引導區)選項關閉。否則在安裝LILO時會出現死機。 將PnP bios(即插即用)關閉,否則Linux可能不能正確檢測用戶的網卡、聲卡和光驅的參數。 將啟動順序調整為(A,C);如果BIOS支持CDROM啟動,而且手上的安裝盤是可以引導的,則也可以選擇啟動順序為(CDROM,C)。 關閉CMOS中的Memory Hole選項,否則不管用戶內存有多大,Linux將只檢測到16M內存。返回10準備硬盤空間準備硬盤空間 使用硬盤上有未分區的空間:為Linux建立一個分區(可在安裝Linux時使用Linux的fdisk程序來完成)。 使用硬盤上有一個未使用的分區首先要刪除現

7、在已不同的分區(可以用DOS的fdisk程序)然后再建立一個Linux分區(方法同1 )。 使用分區上未使用的空間整理原有硬盤上的數據(利用Windows的Defrag程序)改變原有硬盤分區的大小,得到未分配空間(可以使用PQMagic等工具)建立新的Linux分區(同1)返回11決定安裝方式并制作相應軟盤決定安裝方式并制作相應軟盤RedHat提供多種安裝Linux的方法,較常用有:從光盤安裝、從硬盤安裝和通過NFS安裝等。各種安裝方式可能要求不同的啟動盤和補充盤。例如:從光盤安裝只需要一張啟動盤(如果機器能支持光盤啟動且手頭的安裝盤是可以引導的,則甚至不需要制作這張盤);從硬盤安裝需要有一張

8、啟動盤和一張補充盤;通過NFS安裝則需要有一張網絡啟動盤。在DOS上制作上述各種軟盤使用的是RedHat Linux安裝盤dosutils目錄下的rawrite.exe程序。相應磁盤映像則在該安裝盤的images目錄中。返回12硬盤的分區硬盤的分區Linux分區的個數分區的個數 安裝Linux至少需要兩種硬盤分區:一個或多個“Linux native”類型的分區和一個“Linux swap”類型的分區。以下是一些推薦的配置:一個交換分區一個根分區一個/usr分區一個/home分區一個/usr/local分區一個/usr/src分區一個/tmp分區一個/var分區13硬盤的分區硬盤的分區Linu

9、x分區命名規則分區命名規則 Linux通過字母和數字的組合來標識硬盤分區:前兩個字母:表明分區所在設備的類型。通常hd指IDE硬盤,sd指SCSI硬盤。第三個字母:表明分區所處的設備。例如,/dev/hda指第一個IDE主盤;/dev/sdb指第二個SCSI硬盤。數字:代表分區。前四個分區(主分區或擴展分區)用數字1到4表示,邏輯分區從5開始。例如,/dev/hda3指第一個IDE主盤上的第三個主分區或擴展分區;/dev/sdb6則指第二個SCSI硬盤上的第二個邏輯分區。14硬盤的分區硬盤的分區fdisk命令概述命令概述fdisk包含有一個簡單而有用的在線幫助,下面是一些最常用的命令:m:打印

10、出命令列表。p:列出當前的分區情況。n:增加一個分區。l:列出各種分區類型及其對應的值。t:改變一個分區的類型。w:存盤并退出。q:不存盤而退出。返回15配置TCP/IP選擇網絡配置方式16配置TCP/IP設置網關與本地IP17配置TCP/IP設置域名與主機名返回18安裝LILO什么是LILOLILO是the LInux LOader的簡寫,顧名思義是用來引導Linux的。事實上,LILO還是一個優秀的啟動管理器。LILO可以安裝在兩個地方,即主啟動記錄(MBR)或Linux根分區的第一個扇區。若將LILO裝在MBR,當機器啟動時,LILO將顯示一個boot:提示,然后,我們就可以啟動Linu

11、x或由LILO配置的其他操作系統。若原先已經安裝了其他啟動管理器(如:System Commander),則應把LILO裝在Linux根分區的第一個扇區。這時,我們應設置相應的啟動管理器來啟動LILO,進而啟動Linux。19安裝LILO選擇安裝方式20安裝LILO設置LILO選項21安裝LILO選擇可啟動分區返回22Linux中中Internet服務的配置服務的配置 TCP/IP網絡的配置網絡的配置 安裝配置安裝配置WWW服務器服務器 設置匿名設置匿名FTP服務器服務器 BBS服務器的安裝說明服務器的安裝說明返回23TCP/IP網絡的配置網絡的配置三個命令三個命令 ifconfig命令格式:

12、ifconfig interface options例子:ifconfig eth0 02 broadcast 55 netmask route命令格式:route add|del -net|-host destination gw gateway metric metric options例子:route add -net gw 02route add default gw 53route add -host gw host

13、name命令格式:hostname hostname例子:hostname 24TCP/IP網絡的配置網絡的配置兩個文件兩個文件 /etc/hosts文件說明:包含一個IP地址和對應的節點名的列表。例子:mtg /etc/resolv.conf文件說明:設置名字服務器的地址和本網絡的DNS域名例子:nameserver4返回25安裝配置安裝配置WWW服務器服務器準備準備 從光盤上或有關的ftp站點獲取Apache HTTP服務 器 的 源 程 序 包 , 其 文 件 名 可 能 是apache_1.3.0.tar.gz。 在安裝目錄/usr/local/etc下,使用命令行

14、“tar zxvf apache_1.3.0.tar.gz” 把取得的源程序包打開,生成apache_1.3.0目錄。 用命令行“ln -s apache_1.3.0 httpd”建立一個名為httpd的符號連接。 26安裝配置安裝配置WWW服務器服務器安裝安裝 將apache_1.3.0/src目錄下的Configuration.tmpl文件拷貝成Configuration,并對它進行編輯。該文件中包含對一些“Rule”和“Module”的設置。Apache的設計使用可加載模塊的方式,我們若希望加入某模塊,就將該文件中相應行前的“”去掉。 運行Configure腳本文件,生成Makefile

15、文件。 運行make程序,編譯Apache HTTP服務器。如果一切順利的話,則apache_1.3.0/src目錄下將生成可執行文件httpd。 27安裝配置安裝配置WWW服務器服務器配置配置 修改Apache HTTP配置文件apache_1.3.0/conf目錄中有三個的配置文件模版:srm.conf-dist、access.conf-dist和httpd.conf-dist,先將它們分別拷貝成srm.conf、access.conf和httpd.conf,再對它們進行相應的修改。http.conf文件:用來配置服務器的基本參數。我們可能需要改動其中的Group,ServerAdmin和

16、ServerName。 srm.conf文件設置文件樹的根目錄及一些特殊功能,我們應定義幾個目錄別名,去掉該文件中如下的兩行前的“”:Alias /icons/ /usr/local/etc/httpd/icons/ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/ 設置系統啟動方式 httpd可有兩種啟動方式:inetd和standalone,可以通過設置http.conf文件中的ServerType參數來實現。返回28設置匿名設置匿名FTP服務器服務器建立帳號建立帳號在系統中建立一個新的用戶ftp和一個新的用戶組ftp。為了安全,用戶和G

17、ID應該是遠離其它UID和GID的值,例如30000。ftp用戶應該屬于ftp組,而且ftp組除了ftp外應不含其他用戶。ftp用戶的shell應該是一個不存在的shell或干脆放空。這樣在建立了相應用戶后,/etc/passwd文件應該包含如下的行: :而/etc/group文件中則有如下行:ftp:*:30000:ftp為管理的方便和安全,我們還可建立一個FTP管理員帳號,如。對FTP服務器中向外發布文件的管理應使用這個帳號完成。29設置匿名設置匿名FTP服務器服務器創建目錄創建目錄匿名FTP服務器中通常應有如下目錄(主目錄/home/ftp用表示): /:這個目錄的屬主應該是root,并

18、且是任何人不可寫的(0555)。 /bin:其屬主應該是root,并且是任何人不可寫的(0111)。其中文件的保護應該是0111。 /lib:這個目錄的屬主應該是root,并且是任何人不可寫的(0111)。其中文件的保護應該是0555。 /etc:拷貝/etc/passwd和/etc/group文件到這個目錄下,并從中刪除除ftp用戶和組以外的其它用戶和組信息。這兩個文件應該是可讀的(0444)。/pub:這個目錄的屬主和組應是FTP管理員()的屬主和組,其保護應該是0755。 /incoming:這個目錄的屬主和組應是ftp,保護可以是0755或0775。30設置匿名設置匿名FTP服務器服務

19、器配置文件配置文件 /etc/:定義文件的“飛行”轉換規則。即文件或目錄在使用RETRIEVE命令傳遞過程中進行壓縮(解壓縮)和打包的規則。這個文件一般可以拷貝自ftp系統的范例文件。 /etc/:本地用戶若其用戶名出現在本文件中,將不被允許使用此FTP服務器,我們應將root及其他系統帳號(如:bin、sys)加入到本文件中。 /etc/:本文件中設置允許或拒絕某些特定節點(或域)以匿名登錄。例如:allow5deny.*31設置匿名設置匿名FTP服務器服務器/etc/:FTP服務器的主要配置文件。# 定義用戶類別Classallreal,guest,anonymous

20、*# 定義嘗試登錄次數loginfails 5# 定義用戶使用命令的權限compressyesalltaryesallchmodnoguest,anonymousdeletenoguest,anonymousoverwritenoguest,anonymousrenamenoguest,anonymous# 配置上轉文件夾upload/home/ yes 0644 dirs返回32BBS服務器的安裝服務器的安裝建立帳號建立帳號 在/etc/passwd文件中添加如下三行:bbsroot:9990:99:BBS adm:/home/bbsroot:/bin/cshbbs:9999:99:BBS

21、user:/home/bbs:/home/bbs/bin/bbsrfbbsuser:9999:99:BBS user:/home/bbs:/bin/csh 在/etc/group內應該設定bbs的group:bbs:*:99:bbs,bbsuser,bbsroot 在/etc/shells中加入/home/bbs/bin/bbsrf。 在/home下建立bbsroot和bbs兩目錄,執行如下命令: ( chown bbsroot.bbs bbsroot ; chown bbs.bbs bbs ) 分別替bbsroot和bbsuser設定密碼。 33BBS服務器的安裝服務器的安裝解壓與安裝解壓與

22、安裝 以bbsroot身份登錄系統,用tar命令將所得的BBS軟件包解壓。生成bbs_src目錄。 以bbsroot登錄系統,到bbs_src/目錄下執行:( cd CONFIG ; ./configure )。按要求填寫相應的BBS信息。編輯得到的Makefile文件,將其中INSTALL=/install -c一行中的/install改為系統install程序的路徑。 在bbs_src/下執行make命令,順利的話,bbs_src/目錄下應已產生了bbs,bbsrf,chatd及thread四個文件。 以root登錄系統,在/home/bbsroot/bbs_src目錄下執行:make i

23、nstallmake installchatdmake installthread返回34Linux編程環境簡介編程環境簡介 使用編程工具使用編程工具編輯工具編輯工具gcc簡介簡介 常用的系統調用常用的系統調用返回35編輯工具編輯工具Vi的使用的使用Vi有三種工作方式:正文插入方式、命令方式和ex轉換方式。下面介紹最常用的命令::w若正文已經被修改,則將正文存盤:q退出Vi編輯程序(不存盤):q!強行退出Vi編輯程序:x存盤并退出:!sh進入子shell,用ctrl-d返回:set number顯示行號:set nonumber隱藏行號h(),l(),k(),j()移動光標i在光標所在的字符之

24、前插入正文a在光標所在的字符之后插入正文dd刪除當前行x刪除光標所在的字符/string向前搜索字符string36編輯工具編輯工具Emacs簡介簡介Emacs(Editor MACroS)和vi不同,沒有編輯狀態和命令狀態之分,其最重要的概念是其獨特的緩沖區,Emacs編輯的所有文件都是放在緩沖區中的,Emacs支持同時編輯多個緩沖區,它可以將一個文件在多個緩沖區中打開不同的拷貝。一般所有的緩沖區在硬盤上都有一個以“”開頭的備份文件,這樣在系統突然崩潰的時候可以即時將用戶的工作進行備份。在Emacs中,我們可以對多種程序語言(C,C+,Perl,Lisp等)的程序進行編譯,調試等。Emac為

25、我們提供菜單界面。下面是幾個常用菜單項的熱鍵(其中,C-表示Ctrl+):Open Files:C-x C-fOpen Directory:C-x C-dSave Buffer:C-x C-sSave Buffer As:C-x C-wExit Emacs:C-x C-c取得幫助:C-h返回37gcc簡介GNU的C編譯器是gcc,是編程人員最常用的編譯工具。它在編譯C程序生成可執行文件看起來像是一步完成的,但是事實上,它要經歷四個步驟:預處理、編譯、匯編和連接。gcc的使用頗為復雜,選項有上百個之多,其基本用法為:$ gcc -o prog main.c subr1.c subr2.c sub

26、r3.c這條命令行將main.c、subr1.c、subr2.c、subr3.c編譯連接成可執行文件prog。若省略-o選項則gcc使用缺省的可執行文件名a.out。返回38常用的系統調常用的系統調fork()功能:創建一個新的進程.語法:#include #include pid_t fork ();返回值:成功則子進程返回0,父進程返回子進程號。失敗返回-1。例子:pid_t pid;if (pid=fork ()0) printf (“Im parentn”); else if (pid=0) printf (“Im childn”); else printf (“fork errorn

27、”); 39常用的系統調常用的系統調exec()功能:執行一個文件語法:#include int execl(char *path,char *arg0,.,(char *)0);int execv(char *path,char *argv);int execle(char *path,char *arg0,(char *)0,char *envp);int execve(char *path,char *argv,char *envp);int execl(char * *arg0,.,(char *)0);int execvp(char * *argv);返回值:失敗時返回-1。例子:e

28、xecl (“/bin/ps” , “ps” , “-ef” , (char *)0);printf (“fork errorn”);exit (-1);40常用的系統調常用的系統調wait()和和waitpid()功能:等待一個子進程返回并修改狀態語法:#include #include pid_t wait (int *stat_loc);pid_t waitpid (pid_t pid , int *stat_loc , int options);返回值:等待到一個子進程返回時,返回該子進程號,否則返回-1。同時stat_loc存放子進程的返回值。41常用的系統調常用的系統調exit()

29、功能:終止進程.語法:#include void exit (int status);說明:調用進程被該系統調用終止。返回值:無例子:if (fork ()0) wait (int *)0); /*父進程等子進程*/else /*子進程處理過程*/exit (0); 返回42Linux上上Socket編程及實例編程及實例 Berkeley套接字概述套接字概述 套接字基礎知識套接字基礎知識 基本套接字基本套接字基本套接字系統調用基本套接字系統調用客戶服務器模式客戶服務器模式 DNS的操作的操作 五種五種I/O模式模式 使用使用Inetd 返回43Berkeley套接字概述套接字概述套接字歷史套接

30、字歷史在80年代早期,遠景研究規劃局資助了加利福尼亞大學伯克利分校的一個研究組,讓他們將TCP/IP軟件移植到UNIX操作系統中。作為項目的一部分,設計者們創建了一個接口,應用進程使用這個接口可以方便地進行通信。于是就出現了插口接口(Berkeley套接口)。它首先出現在BSD 4.1中。由于許多計算機廠商都采用了Berkeley UNIX,于是許多機器上都可以使用套接字。這樣,套接字就被廣泛使用,到現在已經成為事實上的標準。 44Berkeley套接字概述套接字概述何謂套接字何謂套接字套接字(Socket)英文原意是“插座”,作為BSD UNIX的進程通信機制,它實質上提供了進程通信的端點。

31、每個套接字都包含三個值:協議、本地地址和本地端口號。套接字有本地唯一的套接字號,是一個整型數。事實上它是一個文件描述符。45Berkeley套接字概述套接字概述套接字類型套接字類型 流式套接字(SOCK_STREAM):提供可靠的、面向連接的通信流,通過它發送的數據保證原有順序不變。它使用的是TCP協議。 數據報套接字(SOCK_DGRAM):定義了一種無連接的服務,數據通過相互獨立的報文進行傳輸,是無序的,并且不保證可靠、無差錯。它使用的是UDP協議。 原始套接字(SOCK_RAW) :允許對底層的協議直接訪問,主要用于新的網絡協議的開發。它功能強大,但沒有上面兩種套接字方便。 返回46套接

32、字基礎知識套接字基礎知識IPv4套接字地址結構套接字地址結構IPv4套接字地址結構在netinet/in.h文件中定義:struct in_addr in_addr_ts_addr;/32位IPv4地址;/網絡字節順序struct sockaddr_inuint8_tsin_len;/結構的長度(=16)sa_family_tsin_family;/AF_INETin_port_tsin_port;/16端口號/網絡字節順序struct in_addr sin_addr;charsin_zero8;/無用;47套接字基礎知識套接字基礎知識IPv6套接字地址結構套接字地址結構IPv6套接字地址結

33、構在netinet/in.h文件中定義:struct in6_addr uint8_ts6_addr16;/128位IPv6地址;/網絡字節順序struct sockaddr_in6uint8_tsin6_len;/結構的長度(=24)sa_family_tsin6_family;/AF_INET6in_port_tsin6_port;/16位端口號/網絡字節順序uint32_tsin6_flowinfo;/優先級和流標記/網絡字節順序struct in6_addrsin6_addr;48套接字基礎知識套接字基礎知識一般套接字地址結構一般套接字地址結構 一般的套接字地址結構在sys/socke

34、t.h文件中定義:struct sockaddruint8_tsa_len;/結構的長度(=16)sa_family_tsa_family;/地址族:AF_xxxcharsa_data14;/協議特殊的地址;套接字函數地址參數被定義成取得一般的套接字地址結構,例如下面的函數:int bind (int , struct sockaddr *, socklen_t)對它的調用應是如下:struct sockaddr_in serv;bind (sockfd , (struct sockaddr *) &serv , sizeof (serv);49套接字基礎知識套接字基礎知識字節順序轉換

35、字節順序轉換(1) 主機字節順序和網絡字節順序:不同的機器,內部對變量的字節存儲順序不同。有的系統是高位在前,低位在后;有的系統則是低位在前,高位在后。這種由特定系統定義的順序我們稱為主機字節順序。網絡協議要求在網絡傳輸的數據具有統一的順序,我們稱為網絡字節順序。 50套接字基礎知識套接字基礎知識字節順序轉換字節順序轉換(2) 有關的轉換函數:#include uint16_t htons (uint16_t host16bitvalue);uint32_t htonl (uint32_t host32bitvalue);uint16_t ntohs (uint16_t net16bitval

36、ue);uint32_t ntohl (uint32_t net32bitvalue);51套接字基礎知識套接字基礎知識IP地址轉換地址轉換(1)#include int inet_aton (const char * strptr , struct in_addr *addrptr);/將C字符串轉換成地址值。成功返回1,否則返回0。in_addr_t inet_addr (const char * strptr);/將C字符串轉換成地址值。成功返回該值,否則返回INADDR_NONE。char *inet_ntoa (struct in_addr inaddr);/將32位二進制網絡字節順

37、序IPv4地址轉換成對應的帶小數點的十進制數字串。返回值將是該字符串。int inet_pton (int family , const char * strptr , void *addrptr);/將C字符串轉換成地址值,成功返回1,字符串格式不合法返回0,錯誤返回-1。const char *inet_ntop (int family , const void * addrptr , char *strptr , size_t len);/執行與inet_pton相反的功能。失敗返回NULL。52套接字基礎知識套接字基礎知識IP地址轉換地址轉換(2)關于inet_ntoa的一個例子:ch

38、ar *a1,*a2;struct in_addr inaddr1,inaddr2;inaddr1.s_addr=htonl (0 xD2220601);inaddr2.s_addr=htonl (0 xD2220666);a1=inet_ntoa (inaddr1);a2=inet_ntoa (inaddr2);printf (“address 1: %s n”,a1);printf (“address 2: %s n”,a2);上面程序的返回值是:address 1: 02address 2: 0253套接字基礎知識套接字基礎知識字節處理函數字節處理

39、函數#include void bzero (void *dest , size_t nbytes);/將目標中特定數目的字節置0。void bcopy (const void *src , void *dest , size_t nbytes);/從源中拷貝特定數目的字節到目標中。int bcmp (const void *ptr1 , const void *ptr2 ,size_t nbytes);/比較兩個任意字符串。相同返回0,否則返回非零。void memset (void *dest , int c , size_t len);/將目標中特定數目的字節置為值c。void *mem

40、cpy (void *dest , const void *src , size_t nbytes);/從源中拷貝特定數目的字節到目標中。int memcmp (const void *ptr1 ,const void *ptr2 , size_t nbytes);/比較兩個任意字符串。相同返回0,否則返回非零。返回54socket ()bind ()listen ()accept ()read ()或recv ()write ()或send ()read ()或recv ()close ()阻塞直到客戶連接建立連接TCP三次握手數據(要求)數據(應答)文件結束標志TCP Serversock

41、et ()connect ()write ()或send ()read ()或recv ()close ()TCP Client面向連接套接字的工作流程面向連接套接字的工作流程55socket ()bind ()recvfrom ()sendto ()close ()阻塞直到客戶連接數據(要求)數據(應答)UDP ServerTCP Clientsocket ()sendto ()recvfrom ()無連接套接字的工作流程無連接套接字的工作流程返回56基本套接字系統調用基本套接字系統調用socket ()功能:取得套接字描述符。語法:# include int socket (int fam

42、ily , int type , int protocol);返回值:成功時返回非負描述符,失敗時返回-1。說明:family參數指定套接字的協議族(IPv4為AF_INET、IPv6為AF_INET6);type參數指定套接字的類型(SOCK_STREAM、SOCK_DGRAM或SOCK_RAW)。除非使用原始套接字,否則protocol參數應設為0。返回57基本套接字系統調用基本套接字系統調用bind ()功能:指定一定的協議地址到某套接字。語法:# include # include int bind (int sockfd , const struct sockaddr *myaddr

43、 , socklen_t addrlen);返回值:成功時返回0,失敗時返回-1。說明:通過指定端口號為0,讓bind選擇一個端口號。通過如下方法可指定自動獲取IP地址時:struct sockaddr_in serv4; /IPv4serv4.sin_addr.s_addr=htonl (INADDR_ANY);struct sockaddr_in6 serv6; /IPv6serv6.sin6_addr=in6addr_any;相關函數:getsockname ()、setsockopt ()返回58基本套接字系統調用基本套接字系統調用getsockname ()語法:# include

44、# include int getsockname (int sockfd,struct sockaddr *localaddr,socklen_t *addrlen);返回值:成功時返回0,失敗時返回-1。說明:可能需要使用本函數的情況主要有三個,即成功地連接之后、用端口號0調用bind函數、在調用bind時指定自動獲取IP地址。返回59基本套接字系統調用基本套接字系統調用setsockopt ()功能:取得和設置套接字選項。語法:# include # include int setsockopt (int sockfd,int level,int optname,const void *

45、optval,socklen_t optlen);返回值:成功時返回0,失敗時返回-1。說 明 : 第 二 個 參 數 指 定 系 統 中 解 釋 選 項 的 代 碼(SOL_SOCKET:一般,IPPROTO_IP:IPv4等)。缺省情況下,一個套接字終止后不能用同一端口重啟。為解決這個問題,服務器程序中在socket和bind之間通常應該用setsockopt函數設置選項SO_REUSEADDR:int opt=1;setsockopt (sockfd,SOL_SOCKET,SO_REUSEADDR,&opt , sizeof (opt);返回60基本套接字系統調用基本套接字系統調

46、用listen ()功能:進行系統偵聽,等待客戶連接。語法:# include int listen (int sockfd , int backlog);返回值:成功時返回0,失敗時返回-1。說明:當一個套接字被創建時,在缺省的情況下,它是一個主動的套接字,也就是一個將調用connect的客戶套接字。這個函數的作用就是將一個尚未連接的套接字轉換為一個被動的套接字,也就是內核將接收外來的針對這個套接字的連接請求。第二個參數是指定了未經處理的連接請求隊列可以容納的最大數目,推薦值應該是5到10。 返回61基本套接字系統調用基本套接字系統調用accept ()功能:完成一個連接。語法:# incl

47、ude # include int accept (int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen);返回值:成功時返回非負描述符,失敗時返回-1。說明:當本函數被調用時,TCP服務器將從等待隊列的前面返回下一個連接。如果該隊列為空則在阻塞套接字的情況下服務器進程將轉入阻塞狀態。函數成功返回后將返回一個新的套接字描述符,用來表示這個連接。遠程主機的信息將由參數cliaddr返回,而該地址結構的大小將由addrlen返回。相關函數:getpeername ()返回62基本套接字系統調用基本套接字系統調用getpeername ()功

48、能:返回與一個套接字相關的遠程協議地址。語法:# include # include int getpeername (int sockfd,struct sockaddr *peeraddr,socklen_t *addrlen);返回值:成功時返回0,失敗時返回-1。說明:通常服務器在調用了accept完成一個連接后就可以獲得遠程主機的有關信息。但有一種特殊的情況,即服務器本身不調用accept,它是被調用accept的進程用exec啟動的。這時,服務器進程若需要知道遠程主機的信息就必須調用本函數。返回63基本套接字系統調用基本套接字系統調用connect ()功能:和指定服務器建立連接。

49、語法:# include # include int connect (int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);返回值:成功時返回0,失敗時返回-1。說明:sockfd是一個由socket函數返回的套接字描述符。第二和第三個參數分別是指向一個套接字的指針和其大小。在調用本函數之前,我們并不需要調用bind函數,內核將為我們選擇一個端口號和IP地址。本函數不僅可以用來進行TCP連接,而且可以用在UDP中。當對一個UDP套接字使用本函數時,內核僅記錄對方的IP地址和端口號,然后直接返回到調用進程。返回64基本套接字

50、系統調用基本套接字系統調用write ()功能:向一個套接字發送一定字節的數據。語法:# include # include ssize_t write (int sockfd, const void *buff,size_t nbytes);返回值:返回已成功發送字節數,失敗返回-1。65基本套接字系統調用基本套接字系統調用read ()功能:從一個套接字接收一定字節的數據。語法:# include # include ssize_t read (int sockfd , void *buff , size_t nbytes);返回值:返回讀到字節數,讀到EOF時返回0,失敗返回-1。說明:

51、在流式套接字中也使用read和write函數,但其行為和在通常文件I/O時不同。在這里,一個read或write可能發送或接收比所要求量小的數據,但這卻不是一個錯誤。原因是這個調用可能已經到達了套接字在內核中的緩沖區限制。這時只需再次調用read或write就可以了。這種現象在我們調用read時經常發生,而僅當我們的套接字是非阻塞的(見后)時,才會出現在write調用中。66基本套接字系統調用基本套接字系統調用send ()功能:向一個套接字發送一定字節的數據。語法:# include # include ssize_t send (int sockfd, const void *buff,s

52、ize_t nbytes, int flags);返回值:返回已成功發送字節數,失敗返回-1。67基本套接字系統調用基本套接字系統調用recv ()功能:從一個套接字接收一定字節的數據。語法:# include # include ssize_t recv (int sockfd, void *buff, size_t nbytes,int flags);返回值:返回讀到字節數,失敗返回-1。說明:recv和send函數和標準的read和write函數很類似。唯一的差別就在于其調用的第四個參數。recv和send函數的第四個參數是一個整型的標志位。我們可以以位或的形式包含系統允許的一系列標志,

53、從而設置在這一次I/O的特性。通常情況下這個參數都被置為0,實現普通read和write的功能。返回68基本套接字系統調用基本套接字系統調用close ()功能:關閉套接字描述符。語法:# include int close (int sockfd);返回值:成功時返回0,失敗時返回-1。說明:調用本函數后,參數所描述的套接字將被標記成關閉的。從此該套接字對于對應進程將是不可用的。返回69基本套接字系統調用基本套接字系統調用sendto ()功能:發送一定字節數的UDP數據報。語法:# include # include ssize_t sendto (int sockfd, const vo

54、id *buff,size_t nbytes , int flags ,const struct sockaddr *to,socklen_t addrlen);返回值:返回已成功發送字節數,失敗返回-1。70基本套接字系統調用基本套接字系統調用recvfrom ()功能:接收一定字節數的UDP數據報。語法:# include # include ssize_t recvfrom (int sockfd, void *buff,size_t nbytes, int flags,struct sockaddr *from,socklen_t *addrlen);返回值:返回讀到字節數,失敗返回-

55、1。說明:recvfrom和sendto參數主要是用在未連接的UDP套接字中的,其前面四個參數和recv及send相同,參數to和from分別指定所接收數據報的源地址和所發送數據報的目標地址。參數addrlen則指定地址結構的大小。返回71客戶服務器模式客戶服務器模式服務器可以分成兩類:重復型或并發型: 重復型服務器的流程:i1、等待一個客戶請求的到來。i2、處理客戶請求。i3、發送響應給發送請求的客戶。i4、返回i1。并發型服務器的流程:c1、等待一個客戶請求的到來。c2、啟動一個新服務器進程處理客戶請求,處理完畢并發送回應后該新進程終止。c3、返回c1。一般說來,TCP服務器是并發的,而U

56、DP服務器是重復的。返回72DNS的操作的操作DNS簡介簡介到目前為止,我們仍使用數字地址和數值端口號,在編寫實際程序時我們應該使用名字。使用名字有諸多好處:名字容易記憶,數字地址可能變更而名字卻不常改變,轉到IPv6后其地址的長度也要求我們使用名字。DNS是(Domain Name System,域名系統)主要就是用來在主機和IP地址之間進行映射的。這里的主機名可以是簡單名或FQDN(fully qualified domain name,完全限定的域名)。我們在程序中可以使用一些函數查詢名字服務器,達到在名字和地址之間進行轉換的目的。73DNS的操作的操作gethostbyname ()功能:查找主機名返回IP地址。語法:# include struct hostent *gethostbyname (const char *hostname

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論