




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1Linux 組網(wǎng)技術(shù)與網(wǎng)絡通信編程組網(wǎng)技術(shù)與網(wǎng)絡通信編程計算機系99級研究生陳毅東2Linux 組網(wǎng)技術(shù)與網(wǎng)絡通信編程組網(wǎng)技術(shù)與網(wǎng)絡通信編程 Linux概述概述 Linux的安裝的安裝 Linux中中Internet服務的配置服務的配置 Linux編程環(huán)境簡介編程環(huán)境簡介 Linux上上Socket編程及實例編程及實例結(jié)束3Linux概述概述 Linux是什么是什么 Linux的發(fā)展歷史的發(fā)展歷史 Linux與與UNIX的關(guān)系的關(guān)系 Linux的版本號介紹的版本號介紹返回4Linux是什么是什么Linux是一個遵循POSIX標準的免費操作系統(tǒng),具有BSD和System V的擴展特性。它版權(quán)所
2、有者是芬蘭籍的Linus Benedict Torvalds先生和其他開發(fā)人員,并且遵循GPL聲明。返回5Linux的發(fā)展歷史的發(fā)展歷史 1991年8月,來自芬蘭赫爾辛基大學的年輕人Linus Benedict Torvalds,對外發(fā)表了一套全新的操作系統(tǒng)(Linux 0.01版)。 1991年10月5日,Linus發(fā)布了Linux的第一個“正式”版本,即0.02版。在Linux上可以運行bash,GCC。最早Linux被放置在一個FTP服務器上供大家自由下載,F(xiàn)TP管理員認為這是Linus的Minix,因而就建立了一個Linux目錄來存放這些文件,于是Linux這個名字就傳開了,現(xiàn)在已經(jīng)成
3、為約定俗成的名稱了。 1994年3月14日,Linux終于發(fā)布了它的第一個正式版本1.0版,而Linux的討論區(qū)也從原來的comp.os.minix中獨立成為alt.os.linux后來又更名為comp.os.Linux。返回6Linux與與UNIX的關(guān)系的關(guān)系 目前,UNIX有兩個大流派:那就是AT&T發(fā)布的UNIX操作系統(tǒng)System V與美國加州大學伯克利分校發(fā)布的UNIX版BSD(Berkeley Software Distribution)。SVR4是兩大流派融合后的產(chǎn)物。特性典型的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程序?qū)τ?proc (SVR4和Linux)表1SVR系列和BSD系列的特性比較返回7Linux的版本號介紹的版本號介紹 內(nèi)核版本指的是在Linus領(lǐng)導下的開發(fā)小組開發(fā)出的系統(tǒng)內(nèi)核的版本號,例如:2.0.34和2.1.105等。(一般說來,以序號的第二位為偶數(shù)的版本表明這是一個可以使用的穩(wěn)定版本,而序號的第二位奇數(shù)的版本一般有一些新的東西加入,是不一定很穩(wěn)定的測試版本。)
5、一些組織或廠家將Linux系統(tǒng)內(nèi)核與應用軟件和文檔包裝起來,并提供一些安裝界面和系統(tǒng)設(shè)定與管理工具,從而構(gòu)成了一個發(fā)行套件。相對于內(nèi)核版本,發(fā)行套件的版本號隨發(fā)布者的不同而不同,與系統(tǒng)內(nèi)核的版本號是相對獨立的,例如Slackware 7.0,RedHat 7.0,TurboLinux 6.2,RedFlag 1.0等。返回8Linux的安裝的安裝 準備安裝準備安裝設(shè)置設(shè)置CMOS準備硬盤空間準備硬盤空間決定安裝方式并制作相應軟盤決定安裝方式并制作相應軟盤 安裝中的一些注意事項安裝中的一些注意事項硬盤的分區(qū)硬盤的分區(qū)配置配置TCP/IP安裝安裝LILO返回9設(shè)置設(shè)置CMOS 在CMOS中把Ant
6、i virus(防止病毒寫主引導區(qū))選項關(guān)閉。否則在安裝LILO時會出現(xiàn)死機。 將PnP bios(即插即用)關(guān)閉,否則Linux可能不能正確檢測用戶的網(wǎng)卡、聲卡和光驅(qū)的參數(shù)。 將啟動順序調(diào)整為(A,C);如果BIOS支持CDROM啟動,而且手上的安裝盤是可以引導的,則也可以選擇啟動順序為(CDROM,C)。 關(guān)閉CMOS中的Memory Hole選項,否則不管用戶內(nèi)存有多大,Linux將只檢測到16M內(nèi)存。返回10準備硬盤空間準備硬盤空間 使用硬盤上有未分區(qū)的空間:為Linux建立一個分區(qū)(可在安裝Linux時使用Linux的fdisk程序來完成)。 使用硬盤上有一個未使用的分區(qū)首先要刪除現(xiàn)
7、在已不同的分區(qū)(可以用DOS的fdisk程序)然后再建立一個Linux分區(qū)(方法同1 )。 使用分區(qū)上未使用的空間整理原有硬盤上的數(shù)據(jù)(利用Windows的Defrag程序)改變原有硬盤分區(qū)的大小,得到未分配空間(可以使用PQMagic等工具)建立新的Linux分區(qū)(同1)返回11決定安裝方式并制作相應軟盤決定安裝方式并制作相應軟盤RedHat提供多種安裝Linux的方法,較常用有:從光盤安裝、從硬盤安裝和通過NFS安裝等。各種安裝方式可能要求不同的啟動盤和補充盤。例如:從光盤安裝只需要一張啟動盤(如果機器能支持光盤啟動且手頭的安裝盤是可以引導的,則甚至不需要制作這張盤);從硬盤安裝需要有一張
8、啟動盤和一張補充盤;通過NFS安裝則需要有一張網(wǎng)絡啟動盤。在DOS上制作上述各種軟盤使用的是RedHat Linux安裝盤dosutils目錄下的rawrite.exe程序。相應磁盤映像則在該安裝盤的images目錄中。返回12硬盤的分區(qū)硬盤的分區(qū)Linux分區(qū)的個數(shù)分區(qū)的個數(shù) 安裝Linux至少需要兩種硬盤分區(qū):一個或多個“Linux native”類型的分區(qū)和一個“Linux swap”類型的分區(qū)。以下是一些推薦的配置:一個交換分區(qū)一個根分區(qū)一個/usr分區(qū)一個/home分區(qū)一個/usr/local分區(qū)一個/usr/src分區(qū)一個/tmp分區(qū)一個/var分區(qū)13硬盤的分區(qū)硬盤的分區(qū)Linu
9、x分區(qū)命名規(guī)則分區(qū)命名規(guī)則 Linux通過字母和數(shù)字的組合來標識硬盤分區(qū):前兩個字母:表明分區(qū)所在設(shè)備的類型。通常hd指IDE硬盤,sd指SCSI硬盤。第三個字母:表明分區(qū)所處的設(shè)備。例如,/dev/hda指第一個IDE主盤;/dev/sdb指第二個SCSI硬盤。數(shù)字:代表分區(qū)。前四個分區(qū)(主分區(qū)或擴展分區(qū))用數(shù)字1到4表示,邏輯分區(qū)從5開始。例如,/dev/hda3指第一個IDE主盤上的第三個主分區(qū)或擴展分區(qū);/dev/sdb6則指第二個SCSI硬盤上的第二個邏輯分區(qū)。14硬盤的分區(qū)硬盤的分區(qū)fdisk命令概述命令概述fdisk包含有一個簡單而有用的在線幫助,下面是一些最常用的命令:m:打印
10、出命令列表。p:列出當前的分區(qū)情況。n:增加一個分區(qū)。l:列出各種分區(qū)類型及其對應的值。t:改變一個分區(qū)的類型。w:存盤并退出。q:不存盤而退出。返回15配置TCP/IP選擇網(wǎng)絡配置方式16配置TCP/IP設(shè)置網(wǎng)關(guān)與本地IP17配置TCP/IP設(shè)置域名與主機名返回18安裝LILO什么是LILOLILO是the LInux LOader的簡寫,顧名思義是用來引導Linux的。事實上,LILO還是一個優(yōu)秀的啟動管理器。LILO可以安裝在兩個地方,即主啟動記錄(MBR)或Linux根分區(qū)的第一個扇區(qū)。若將LILO裝在MBR,當機器啟動時,LILO將顯示一個boot:提示,然后,我們就可以啟動Linu
11、x或由LILO配置的其他操作系統(tǒng)。若原先已經(jīng)安裝了其他啟動管理器(如:System Commander),則應把LILO裝在Linux根分區(qū)的第一個扇區(qū)。這時,我們應設(shè)置相應的啟動管理器來啟動LILO,進而啟動Linux。19安裝LILO選擇安裝方式20安裝LILO設(shè)置LILO選項21安裝LILO選擇可啟動分區(qū)返回22Linux中中Internet服務的配置服務的配置 TCP/IP網(wǎng)絡的配置網(wǎng)絡的配置 安裝配置安裝配置WWW服務器服務器 設(shè)置匿名設(shè)置匿名FTP服務器服務器 BBS服務器的安裝說明服務器的安裝說明返回23TCP/IP網(wǎng)絡的配置網(wǎng)絡的配置三個命令三個命令 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網(wǎng)絡的配置網(wǎng)絡的配置兩個文件兩個文件 /etc/hosts文件說明:包含一個IP地址和對應的節(jié)點名的列表。例子:mtg /etc/resolv.conf文件說明:設(shè)置名字服務器的地址和本網(wǎng)絡的DNS域名例子:nameserver4返回25安裝配置安裝配置WWW服務器服務器準備準備 從光盤上或有關(guān)的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目錄。 用命令行“l(fā)n -s apache_1.3.0 httpd”建立一個名為httpd的符號連接。 26安裝配置安裝配置WWW服務器服務器安裝安裝 將apache_1.3.0/src目錄下的Configuration.tmpl文件拷貝成Configuration,并對它進行編輯。該文件中包含對一些“Rule”和“Module”的設(shè)置。Apache的設(shè)計使用可加載模塊的方式,我們?nèi)粝M尤肽衬K,就將該文件中相應行前的“”去掉。 運行Configure腳本文件,生成Makefile
15、文件。 運行make程序,編譯Apache HTTP服務器。如果一切順利的話,則apache_1.3.0/src目錄下將生成可執(zhí)行文件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文件:用來配置服務器的基本參數(shù)。我們可能需要改動其中的Group,ServerAdmin和
16、ServerName。 srm.conf文件設(shè)置文件樹的根目錄及一些特殊功能,我們應定義幾個目錄別名,去掉該文件中如下的兩行前的“”:Alias /icons/ /usr/local/etc/httpd/icons/ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/ 設(shè)置系統(tǒng)啟動方式 httpd可有兩種啟動方式:inetd和standalone,可以通過設(shè)置http.conf文件中的ServerType參數(shù)來實現(xiàn)。返回28設(shè)置匿名設(shè)置匿名FTP服務器服務器建立帳號建立帳號在系統(tǒng)中建立一個新的用戶ftp和一個新的用戶組ftp。為了安全,用戶和G
17、ID應該是遠離其它UID和GID的值,例如30000。ftp用戶應該屬于ftp組,而且ftp組除了ftp外應不含其他用戶。ftp用戶的shell應該是一個不存在的shell或干脆放空。這樣在建立了相應用戶后,/etc/passwd文件應該包含如下的行: :而/etc/group文件中則有如下行:ftp:*:30000:ftp為管理的方便和安全,我們還可建立一個FTP管理員帳號,如。對FTP服務器中向外發(fā)布文件的管理應使用這個帳號完成。29設(shè)置匿名設(shè)置匿名FTP服務器服務器創(chuàng)建目錄創(chuàng)建目錄匿名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設(shè)置匿名設(shè)置匿名FTP服務器服務
19、器配置文件配置文件 /etc/:定義文件的“飛行”轉(zhuǎn)換規(guī)則。即文件或目錄在使用RETRIEVE命令傳遞過程中進行壓縮(解壓縮)和打包的規(guī)則。這個文件一般可以拷貝自ftp系統(tǒng)的范例文件。 /etc/:本地用戶若其用戶名出現(xiàn)在本文件中,將不被允許使用此FTP服務器,我們應將root及其他系統(tǒng)帳號(如:bin、sys)加入到本文件中。 /etc/:本文件中設(shè)置允許或拒絕某些特定節(jié)點(或域)以匿名登錄。例如:allow5deny.*31設(shè)置匿名設(shè)置匿名FTP服務器服務器/etc/:FTP服務器的主要配置文件。# 定義用戶類別Classallreal,guest,anonymous
20、*# 定義嘗試登錄次數(shù)loginfails 5# 定義用戶使用命令的權(quán)限compressyesalltaryesallchmodnoguest,anonymousdeletenoguest,anonymousoverwritenoguest,anonymousrenamenoguest,anonymous# 配置上轉(zhuǎn)文件夾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內(nèi)應該設(shè)定bbs的group:bbs:*:99:bbs,bbsuser,bbsroot 在/etc/shells中加入/home/bbs/bin/bbsrf。 在/home下建立bbsroot和bbs兩目錄,執(zhí)行如下命令: ( chown bbsroot.bbs bbsroot ; chown bbs.bbs bbs ) 分別替bbsroot和bbsuser設(shè)定密碼。 33BBS服務器的安裝服務器的安裝解壓與安裝解壓與
22、安裝 以bbsroot身份登錄系統(tǒng),用tar命令將所得的BBS軟件包解壓。生成bbs_src目錄。 以bbsroot登錄系統(tǒng),到bbs_src/目錄下執(zhí)行:( cd CONFIG ; ./configure )。按要求填寫相應的BBS信息。編輯得到的Makefile文件,將其中INSTALL=/install -c一行中的/install改為系統(tǒng)install程序的路徑。 在bbs_src/下執(zhí)行make命令,順利的話,bbs_src/目錄下應已產(chǎn)生了bbs,bbsrf,chatd及thread四個文件。 以root登錄系統(tǒng),在/home/bbsroot/bbs_src目錄下執(zhí)行:make i
23、nstallmake installchatdmake installthread返回34Linux編程環(huán)境簡介編程環(huán)境簡介 使用編程工具使用編程工具編輯工具編輯工具gcc簡介簡介 常用的系統(tǒng)調(diào)用常用的系統(tǒng)調(diào)用返回35編輯工具編輯工具Vi的使用的使用Vi有三種工作方式:正文插入方式、命令方式和ex轉(zhuǎn)換方式。下面介紹最常用的命令::w若正文已經(jīng)被修改,則將正文存盤: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不同,沒有編輯狀態(tài)和命令狀態(tài)之分,其最重要的概念是其獨特的緩沖區(qū),Emacs編輯的所有文件都是放在緩沖區(qū)中的,Emacs支持同時編輯多個緩沖區(qū),它可以將一個文件在多個緩沖區(qū)中打開不同的拷貝。一般所有的緩沖區(qū)在硬盤上都有一個以“”開頭的備份文件,這樣在系統(tǒng)突然崩潰的時候可以即時將用戶的工作進行備份。在Emacs中,我們可以對多種程序語言(C,C+,Perl,Lisp等)的程序進行編譯,調(diào)試等。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程序生成可執(zhí)行文件看起來像是一步完成的,但是事實上,它要經(jīng)歷四個步驟:預處理、編譯、匯編和連接。gcc的使用頗為復雜,選項有上百個之多,其基本用法為:$ gcc -o prog main.c subr1.c subr2.c sub
26、r3.c這條命令行將main.c、subr1.c、subr2.c、subr3.c編譯連接成可執(zhí)行文件prog。若省略-o選項則gcc使用缺省的可執(zhí)行文件名a.out。返回38常用的系統(tǒng)調(diào)常用的系統(tǒng)調(diào)fork()功能:創(chuàng)建一個新的進程.語法:#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常用的系統(tǒng)調(diào)常用的系統(tǒng)調(diào)exec()功能:執(zhí)行一個文件語法:#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常用的系統(tǒng)調(diào)常用的系統(tǒng)調(diào)wait()和和waitpid()功能:等待一個子進程返回并修改狀態(tài)語法:#include #include pid_t wait (int *stat_loc);pid_t waitpid (pid_t pid , int *stat_loc , int options);返回值:等待到一個子進程返回時,返回該子進程號,否則返回-1。同時stat_loc存放子進程的返回值。41常用的系統(tǒng)調(diào)常用的系統(tǒng)調(diào)exit()
29、功能:終止進程.語法:#include void exit (int status);說明:調(diào)用進程被該系統(tǒng)調(diào)用終止。返回值:無例子:if (fork ()0) wait (int *)0); /*父進程等子進程*/else /*子進程處理過程*/exit (0); 返回42Linux上上Socket編程及實例編程及實例 Berkeley套接字概述套接字概述 套接字基礎(chǔ)知識套接字基礎(chǔ)知識 基本套接字基本套接字基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用客戶服務器模式客戶服務器模式 DNS的操作的操作 五種五種I/O模式模式 使用使用Inetd 返回43Berkeley套接字概述套接字概述套接字歷史套接
30、字歷史在80年代早期,遠景研究規(guī)劃局資助了加利福尼亞大學伯克利分校的一個研究組,讓他們將TCP/IP軟件移植到UNIX操作系統(tǒng)中。作為項目的一部分,設(shè)計者們創(chuàng)建了一個接口,應用進程使用這個接口可以方便地進行通信。于是就出現(xiàn)了插口接口(Berkeley套接口)。它首先出現(xiàn)在BSD 4.1中。由于許多計算機廠商都采用了Berkeley UNIX,于是許多機器上都可以使用套接字。這樣,套接字就被廣泛使用,到現(xiàn)在已經(jīng)成為事實上的標準。 44Berkeley套接字概述套接字概述何謂套接字何謂套接字套接字(Socket)英文原意是“插座”,作為BSD UNIX的進程通信機制,它實質(zhì)上提供了進程通信的端點。
31、每個套接字都包含三個值:協(xié)議、本地地址和本地端口號。套接字有本地唯一的套接字號,是一個整型數(shù)。事實上它是一個文件描述符。45Berkeley套接字概述套接字概述套接字類型套接字類型 流式套接字(SOCK_STREAM):提供可靠的、面向連接的通信流,通過它發(fā)送的數(shù)據(jù)保證原有順序不變。它使用的是TCP協(xié)議。 數(shù)據(jù)報套接字(SOCK_DGRAM):定義了一種無連接的服務,數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保證可靠、無差錯。它使用的是UDP協(xié)議。 原始套接字(SOCK_RAW) :允許對底層的協(xié)議直接訪問,主要用于新的網(wǎng)絡協(xié)議的開發(fā)。它功能強大,但沒有上面兩種套接字方便。 返回46套接
32、字基礎(chǔ)知識套接字基礎(chǔ)知識IPv4套接字地址結(jié)構(gòu)套接字地址結(jié)構(gòu)IPv4套接字地址結(jié)構(gòu)在netinet/in.h文件中定義:struct in_addr in_addr_ts_addr;/32位IPv4地址;/網(wǎng)絡字節(jié)順序struct sockaddr_inuint8_tsin_len;/結(jié)構(gòu)的長度(=16)sa_family_tsin_family;/AF_INETin_port_tsin_port;/16端口號/網(wǎng)絡字節(jié)順序struct in_addr sin_addr;charsin_zero8;/無用;47套接字基礎(chǔ)知識套接字基礎(chǔ)知識IPv6套接字地址結(jié)構(gòu)套接字地址結(jié)構(gòu)IPv6套接字地址結(jié)
33、構(gòu)在netinet/in.h文件中定義:struct in6_addr uint8_ts6_addr16;/128位IPv6地址;/網(wǎng)絡字節(jié)順序struct sockaddr_in6uint8_tsin6_len;/結(jié)構(gòu)的長度(=24)sa_family_tsin6_family;/AF_INET6in_port_tsin6_port;/16位端口號/網(wǎng)絡字節(jié)順序uint32_tsin6_flowinfo;/優(yōu)先級和流標記/網(wǎng)絡字節(jié)順序struct in6_addrsin6_addr;48套接字基礎(chǔ)知識套接字基礎(chǔ)知識一般套接字地址結(jié)構(gòu)一般套接字地址結(jié)構(gòu) 一般的套接字地址結(jié)構(gòu)在sys/socke
34、t.h文件中定義:struct sockaddruint8_tsa_len;/結(jié)構(gòu)的長度(=16)sa_family_tsa_family;/地址族:AF_xxxcharsa_data14;/協(xié)議特殊的地址;套接字函數(shù)地址參數(shù)被定義成取得一般的套接字地址結(jié)構(gòu),例如下面的函數(shù):int bind (int , struct sockaddr *, socklen_t)對它的調(diào)用應是如下:struct sockaddr_in serv;bind (sockfd , (struct sockaddr *) &serv , sizeof (serv);49套接字基礎(chǔ)知識套接字基礎(chǔ)知識字節(jié)順序轉(zhuǎn)換
35、字節(jié)順序轉(zhuǎn)換(1) 主機字節(jié)順序和網(wǎng)絡字節(jié)順序:不同的機器,內(nèi)部對變量的字節(jié)存儲順序不同。有的系統(tǒng)是高位在前,低位在后;有的系統(tǒng)則是低位在前,高位在后。這種由特定系統(tǒng)定義的順序我們稱為主機字節(jié)順序。網(wǎng)絡協(xié)議要求在網(wǎng)絡傳輸?shù)臄?shù)據(jù)具有統(tǒng)一的順序,我們稱為網(wǎng)絡字節(jié)順序。 50套接字基礎(chǔ)知識套接字基礎(chǔ)知識字節(jié)順序轉(zhuǎn)換字節(jié)順序轉(zhuǎn)換(2) 有關(guān)的轉(zhuǎn)換函數(shù):#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套接字基礎(chǔ)知識套接字基礎(chǔ)知識IP地址轉(zhuǎn)換地址轉(zhuǎn)換(1)#include int inet_aton (const char * strptr , struct in_addr *addrptr);/將C字符串轉(zhuǎn)換成地址值。成功返回1,否則返回0。in_addr_t inet_addr (const char * strptr);/將C字符串轉(zhuǎn)換成地址值。成功返回該值,否則返回INADDR_NONE。char *inet_ntoa (struct in_addr inaddr);/將32位二進制網(wǎng)絡字節(jié)順
37、序IPv4地址轉(zhuǎn)換成對應的帶小數(shù)點的十進制數(shù)字串。返回值將是該字符串。int inet_pton (int family , const char * strptr , void *addrptr);/將C字符串轉(zhuǎn)換成地址值,成功返回1,字符串格式不合法返回0,錯誤返回-1。const char *inet_ntop (int family , const void * addrptr , char *strptr , size_t len);/執(zhí)行與inet_pton相反的功能。失敗返回NULL。52套接字基礎(chǔ)知識套接字基礎(chǔ)知識IP地址轉(zhuǎn)換地址轉(zhuǎn)換(2)關(guān)于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套接字基礎(chǔ)知識套接字基礎(chǔ)知識字節(jié)處理函數(shù)字節(jié)處理
39、函數(shù)#include void bzero (void *dest , size_t nbytes);/將目標中特定數(shù)目的字節(jié)置0。void bcopy (const void *src , void *dest , size_t nbytes);/從源中拷貝特定數(shù)目的字節(jié)到目標中。int bcmp (const void *ptr1 , const void *ptr2 ,size_t nbytes);/比較兩個任意字符串。相同返回0,否則返回非零。void memset (void *dest , int c , size_t len);/將目標中特定數(shù)目的字節(jié)置為值c。void *mem
40、cpy (void *dest , const void *src , size_t nbytes);/從源中拷貝特定數(shù)目的字節(jié)到目標中。int memcmp (const void *ptr1 ,const void *ptr2 , size_t nbytes);/比較兩個任意字符串。相同返回0,否則返回非零。返回54socket ()bind ()listen ()accept ()read ()或recv ()write ()或send ()read ()或recv ()close ()阻塞直到客戶連接建立連接TCP三次握手數(shù)據(jù)(要求)數(shù)據(jù)(應答)文件結(jié)束標志TCP Serversock
41、et ()connect ()write ()或send ()read ()或recv ()close ()TCP Client面向連接套接字的工作流程面向連接套接字的工作流程55socket ()bind ()recvfrom ()sendto ()close ()阻塞直到客戶連接數(shù)據(jù)(要求)數(shù)據(jù)(應答)UDP ServerTCP Clientsocket ()sendto ()recvfrom ()無連接套接字的工作流程無連接套接字的工作流程返回56基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用socket ()功能:取得套接字描述符。語法:# include int socket (int fam
42、ily , int type , int protocol);返回值:成功時返回非負描述符,失敗時返回-1。說明:family參數(shù)指定套接字的協(xié)議族(IPv4為AF_INET、IPv6為AF_INET6);type參數(shù)指定套接字的類型(SOCK_STREAM、SOCK_DGRAM或SOCK_RAW)。除非使用原始套接字,否則protocol參數(shù)應設(shè)為0。返回57基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用bind ()功能:指定一定的協(xié)議地址到某套接字。語法:# 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;相關(guān)函數(shù):getsockname ()、setsockopt ()返回58基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用getsockname ()語法:# include
44、# include int getsockname (int sockfd,struct sockaddr *localaddr,socklen_t *addrlen);返回值:成功時返回0,失敗時返回-1。說明:可能需要使用本函數(shù)的情況主要有三個,即成功地連接之后、用端口號0調(diào)用bind函數(shù)、在調(diào)用bind時指定自動獲取IP地址。返回59基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用setsockopt ()功能:取得和設(shè)置套接字選項。語法:# include # include int setsockopt (int sockfd,int level,int optname,const void *
45、optval,socklen_t optlen);返回值:成功時返回0,失敗時返回-1。說 明 : 第 二 個 參 數(shù) 指 定 系 統(tǒng) 中 解 釋 選 項 的 代 碼(SOL_SOCKET:一般,IPPROTO_IP:IPv4等)。缺省情況下,一個套接字終止后不能用同一端口重啟。為解決這個問題,服務器程序中在socket和bind之間通常應該用setsockopt函數(shù)設(shè)置選項SO_REUSEADDR:int opt=1;setsockopt (sockfd,SOL_SOCKET,SO_REUSEADDR,&opt , sizeof (opt);返回60基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)
46、用listen ()功能:進行系統(tǒng)偵聽,等待客戶連接。語法:# include int listen (int sockfd , int backlog);返回值:成功時返回0,失敗時返回-1。說明:當一個套接字被創(chuàng)建時,在缺省的情況下,它是一個主動的套接字,也就是一個將調(diào)用connect的客戶套接字。這個函數(shù)的作用就是將一個尚未連接的套接字轉(zhuǎn)換為一個被動的套接字,也就是內(nèi)核將接收外來的針對這個套接字的連接請求。第二個參數(shù)是指定了未經(jīng)處理的連接請求隊列可以容納的最大數(shù)目,推薦值應該是5到10。 返回61基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用accept ()功能:完成一個連接。語法:# incl
47、ude # include int accept (int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen);返回值:成功時返回非負描述符,失敗時返回-1。說明:當本函數(shù)被調(diào)用時,TCP服務器將從等待隊列的前面返回下一個連接。如果該隊列為空則在阻塞套接字的情況下服務器進程將轉(zhuǎn)入阻塞狀態(tài)。函數(shù)成功返回后將返回一個新的套接字描述符,用來表示這個連接。遠程主機的信息將由參數(shù)cliaddr返回,而該地址結(jié)構(gòu)的大小將由addrlen返回。相關(guān)函數(shù):getpeername ()返回62基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用getpeername ()功
48、能:返回與一個套接字相關(guān)的遠程協(xié)議地址。語法:# include # include int getpeername (int sockfd,struct sockaddr *peeraddr,socklen_t *addrlen);返回值:成功時返回0,失敗時返回-1。說明:通常服務器在調(diào)用了accept完成一個連接后就可以獲得遠程主機的有關(guān)信息。但有一種特殊的情況,即服務器本身不調(diào)用accept,它是被調(diào)用accept的進程用exec啟動的。這時,服務器進程若需要知道遠程主機的信息就必須調(diào)用本函數(shù)。返回63基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用connect ()功能:和指定服務器建立連接。
49、語法:# include # include int connect (int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);返回值:成功時返回0,失敗時返回-1。說明:sockfd是一個由socket函數(shù)返回的套接字描述符。第二和第三個參數(shù)分別是指向一個套接字的指針和其大小。在調(diào)用本函數(shù)之前,我們并不需要調(diào)用bind函數(shù),內(nèi)核將為我們選擇一個端口號和IP地址。本函數(shù)不僅可以用來進行TCP連接,而且可以用在UDP中。當對一個UDP套接字使用本函數(shù)時,內(nèi)核僅記錄對方的IP地址和端口號,然后直接返回到調(diào)用進程。返回64基本套接字
50、系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用write ()功能:向一個套接字發(fā)送一定字節(jié)的數(shù)據(jù)。語法:# include # include ssize_t write (int sockfd, const void *buff,size_t nbytes);返回值:返回已成功發(fā)送字節(jié)數(shù),失敗返回-1。65基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用read ()功能:從一個套接字接收一定字節(jié)的數(shù)據(jù)。語法:# include # include ssize_t read (int sockfd , void *buff , size_t nbytes);返回值:返回讀到字節(jié)數(shù),讀到EOF時返回0,失敗返回-1。說明:
51、在流式套接字中也使用read和write函數(shù),但其行為和在通常文件I/O時不同。在這里,一個read或write可能發(fā)送或接收比所要求量小的數(shù)據(jù),但這卻不是一個錯誤。原因是這個調(diào)用可能已經(jīng)到達了套接字在內(nèi)核中的緩沖區(qū)限制。這時只需再次調(diào)用read或write就可以了。這種現(xiàn)象在我們調(diào)用read時經(jīng)常發(fā)生,而僅當我們的套接字是非阻塞的(見后)時,才會出現(xiàn)在write調(diào)用中。66基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用send ()功能:向一個套接字發(fā)送一定字節(jié)的數(shù)據(jù)。語法:# include # include ssize_t send (int sockfd, const void *buff,s
52、ize_t nbytes, int flags);返回值:返回已成功發(fā)送字節(jié)數(shù),失敗返回-1。67基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用recv ()功能:從一個套接字接收一定字節(jié)的數(shù)據(jù)。語法:# include # include ssize_t recv (int sockfd, void *buff, size_t nbytes,int flags);返回值:返回讀到字節(jié)數(shù),失敗返回-1。說明:recv和send函數(shù)和標準的read和write函數(shù)很類似。唯一的差別就在于其調(diào)用的第四個參數(shù)。recv和send函數(shù)的第四個參數(shù)是一個整型的標志位。我們可以以位或的形式包含系統(tǒng)允許的一系列標志,
53、從而設(shè)置在這一次I/O的特性。通常情況下這個參數(shù)都被置為0,實現(xiàn)普通read和write的功能。返回68基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用close ()功能:關(guān)閉套接字描述符。語法:# include int close (int sockfd);返回值:成功時返回0,失敗時返回-1。說明:調(diào)用本函數(shù)后,參數(shù)所描述的套接字將被標記成關(guān)閉的。從此該套接字對于對應進程將是不可用的。返回69基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用sendto ()功能:發(fā)送一定字節(jié)數(shù)的UDP數(shù)據(jù)報。語法:# include # include ssize_t sendto (int sockfd, const vo
54、id *buff,size_t nbytes , int flags ,const struct sockaddr *to,socklen_t addrlen);返回值:返回已成功發(fā)送字節(jié)數(shù),失敗返回-1。70基本套接字系統(tǒng)調(diào)用基本套接字系統(tǒng)調(diào)用recvfrom ()功能:接收一定字節(jié)數(shù)的UDP數(shù)據(jù)報。語法:# include # include ssize_t recvfrom (int sockfd, void *buff,size_t nbytes, int flags,struct sockaddr *from,socklen_t *addrlen);返回值:返回讀到字節(jié)數(shù),失敗返回-
55、1。說明:recvfrom和sendto參數(shù)主要是用在未連接的UDP套接字中的,其前面四個參數(shù)和recv及send相同,參數(shù)to和from分別指定所接收數(shù)據(jù)報的源地址和所發(fā)送數(shù)據(jù)報的目標地址。參數(shù)addrlen則指定地址結(jié)構(gòu)的大小。返回71客戶服務器模式客戶服務器模式服務器可以分成兩類:重復型或并發(fā)型: 重復型服務器的流程:i1、等待一個客戶請求的到來。i2、處理客戶請求。i3、發(fā)送響應給發(fā)送請求的客戶。i4、返回i1。并發(fā)型服務器的流程:c1、等待一個客戶請求的到來。c2、啟動一個新服務器進程處理客戶請求,處理完畢并發(fā)送回應后該新進程終止。c3、返回c1。一般說來,TCP服務器是并發(fā)的,而U
56、DP服務器是重復的。返回72DNS的操作的操作DNS簡介簡介到目前為止,我們?nèi)允褂脭?shù)字地址和數(shù)值端口號,在編寫實際程序時我們應該使用名字。使用名字有諸多好處:名字容易記憶,數(shù)字地址可能變更而名字卻不常改變,轉(zhuǎn)到IPv6后其地址的長度也要求我們使用名字。DNS是(Domain Name System,域名系統(tǒng))主要就是用來在主機和IP地址之間進行映射的。這里的主機名可以是簡單名或FQDN(fully qualified domain name,完全限定的域名)。我們在程序中可以使用一些函數(shù)查詢名字服務器,達到在名字和地址之間進行轉(zhuǎn)換的目的。73DNS的操作的操作gethostbyname ()功能:查找主機名返回IP地址。語法:# include struct hostent *gethostbyname (const char *hostname
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 左肱骨髁上骨折護理查房
- 2025年醫(yī)療美容行業(yè)美容整形醫(yī)院行業(yè)規(guī)范與市場前景分析報告
- 2025年醫(yī)療美容行業(yè)抗衰老產(chǎn)品研發(fā)與市場監(jiān)管報告
- 師德與法培訓
- 投資學原理課件
- 2025年醫(yī)療健康產(chǎn)業(yè)市場細分領(lǐng)域市場潛力評估與風險防范策略分析
- 2型糖尿病三級護理查房
- 主播話術(shù)培訓
- 三重一大培訓
- 我們守紀律心理健康教育
- 荊州中學2024-2025學年高二下學期6月月考歷史試卷
- 2025-2030年中國婚慶產(chǎn)業(yè)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2024-2025學年蘇教版四年級下學期期末測試數(shù)學試卷(含答案)
- 2025年新高考2卷(新課標Ⅱ卷)英語試卷
- 2025年中考化學必考要點知識歸納
- 三年級語文下冊全冊重點知識點歸納
- 公路養(yǎng)護材料管理制度
- JG/T 330-2011建筑工程用索
- 單位消防培訓課件教學
- 項目可行性研究報告風險管理與應急措施制定策略
- 生產(chǎn)經(jīng)營單位事故隱患內(nèi)部報告獎勵制度
評論
0/150
提交評論