




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí) 驗(yàn) 報(bào) 告課程名稱: LINUX程序設(shè)計(jì) 學(xué) 院: 計(jì)算機(jī)學(xué)院 專 業(yè): 軟件工程 班 級(jí): 14-3 姓 名: 張正錕 學(xué) 號(hào): 22017年 1月1日山 東 科 技 大 學(xué) 教 務(wù) 處 制實(shí) 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)一 熟悉Linux命令實(shí)驗(yàn)日期第11周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)康氖煜げ⒄莆誏inux操作系統(tǒng)基本命令二、 常用的普通命令1. 了解系統(tǒng)的uname,date,w命令2. 了解文件的ls和file命令3. cat,less,head,tail,nl,wc等命令的使用4. 文本內(nèi)容查找grep 命令5. 文件權(quán)限的修改chmo
2、d,chown,umask6. 文件夾操作:mkdir,rmdir三、 用戶和組的管理管理1. 探究用戶配置文件/etc/passwd, /etc/shadow/etc/passwd是用戶數(shù)據(jù)庫,其中的域給出了用戶名、加密口令和用戶的其他信息. /etc/shadow是在安裝了影子(shadow)口令軟件的系統(tǒng)上的影子口令文件。影子口令文件將/etc/passwd 文件中的加密口令移動(dòng)到/etc/shadow中,而后者只對(duì)超級(jí)用戶( r o o t )可讀。這使破譯口令更困難,以此增加系統(tǒng)的安全性。2. 探究組配置文件組的配置文件/etc/group, /etc/gshadow3. id, w
3、ho, whoami,groups等命令四、 文件打包與壓縮1. tar壓縮和解壓五、 軟件包管理1. 安裝軟件tree2. 卸載軟件tree六、 進(jìn)程管理1. top命令動(dòng)態(tài)顯示進(jìn)程狀態(tài)2. ps命令顯示瞬時(shí)進(jìn)程狀態(tài)3. Kill命令終止一個(gè)進(jìn)程用gedit打開一個(gè)文件a.cpp并在后臺(tái)運(yùn)行,顯示的進(jìn)程號(hào)為17271,然后用kill命令殺死這個(gè)進(jìn)程,觀察到gedit關(guān)閉七、 實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),熟悉了好多Linux下面的基本命令,可以看出Linux的命令基本上都有好多參數(shù)可選,這樣就可以用一條命令完成好多任務(wù),大大提高效率。另外還學(xué)會(huì)了當(dāng)命令不會(huì)使用的時(shí)候,可以調(diào)用man來查看命令的使用方
4、法。實(shí) 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)二Shell編程實(shí)驗(yàn)日期第12周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)康?#216; 掌握Shell命行的運(yùn)行Ø 掌握編寫和執(zhí)行Shell程序的步驟Ø 掌握在Shell中使用參數(shù)和使用變量的方法Ø 掌握表達(dá)式比較,循環(huán)結(jié)構(gòu)語句和條件結(jié)構(gòu)語句的寫法Ø 掌握在shell腳本中使用函數(shù)的方法二、 簡單bash腳本1. 編寫bash腳本2. 添加執(zhí)行權(quán)限3. 運(yùn)行結(jié)果三、 計(jì)算器:變量讀入和輸出1. 編輯程序2. 添加可執(zhí)行權(quán)限3. 運(yùn)行程序四、 比較兩個(gè)數(shù)字是否相等1. 編寫程序2. 添加可
5、執(zhí)行權(quán)限3. 運(yùn)行程序五、 循環(huán)計(jì)算累加和1. 編寫程序2. 添加可執(zhí)行權(quán)限3. 運(yùn)行程序6、 利用shell函數(shù)計(jì)算兩數(shù)之和1. 編寫程序2. 添加可執(zhí)行權(quán)限3. 運(yùn)行程序7、 計(jì)算數(shù)組累乘1. 編寫程序2. 添加可執(zhí)行權(quán)限3. 運(yùn)行程序8、 實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),我學(xué)會(huì)了shell中的各種寫法,包括流程控制,循環(huán),數(shù)組,函數(shù)等等,了解到shell在Linux是一種強(qiáng)大的神器,可以批量完成各種操作。實(shí) 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)三文件操作實(shí)驗(yàn)日期第13周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)繕?biāo)1熟悉cd、date、pwd、cal、who、echo、clea
6、r、passwd等常用命令。 2掌握在用戶主目錄下對(duì)文件進(jìn)行的操作:復(fù)制一個(gè)文件、顯示文件內(nèi)容、查找指定內(nèi)容、排序、文件比較、文件刪除等。 3學(xué)會(huì)對(duì)目錄進(jìn)行管理:創(chuàng)建和刪除子目錄、改變和顯示工作目錄、列出和更改文件權(quán)限、鏈接文件等。 二、 文件操作:修改文件權(quán)限設(shè)計(jì)一個(gè)程序,要求把系統(tǒng)中“/etc”目錄下的passwd文件權(quán)限,設(shè)置成文件所有者可讀可寫,所有其他用戶為只讀權(quán)限。1. 編寫C語言程序2. 編譯執(zhí)行3. 查看結(jié)果三、 從終端讀寫數(shù)據(jù)文件的打開可以用open函數(shù),即使原來的文件不存在,也可以用open函數(shù)創(chuàng)建文件。在打開或者創(chuàng)建文件時(shí),可以指定文件的屬性
7、及用戶的權(quán)限等參數(shù)。關(guān)閉一個(gè)打開的文件,用close函數(shù)。當(dāng)一個(gè)進(jìn)程終止時(shí),它所有已打開的文件都由內(nèi)核自動(dòng)關(guān)閉。1. 編寫C語言程序2. 查看運(yùn)行結(jié)果四、文件上鎖和鎖的釋放1. 題目要求設(shè)計(jì)一個(gè)程序,要求在“/root”下打開一個(gè)名為“5-11file”的文件,如果該文件不存在,則創(chuàng)建此文件。打開后對(duì)其加上強(qiáng)制性的寫入鎖F_WRLCK,按回車后解鎖F_UNLCK,然后加上讀出鎖F_RDLCK,按回車后再解鎖F_UNLCK。程序在終端1運(yùn)行后會(huì)顯示程序的進(jìn)程號(hào),再打開終端2,會(huì)提示此文件處于鎖定狀態(tài),此時(shí)在終端2可以多按回車,觀察程序的運(yùn)行結(jié)果。然后在終端1按回車,等待終端1解鎖后,在終端2才可
8、鎖定此文件,你可觀察到強(qiáng)制性鎖是獨(dú)占狀態(tài),當(dāng)在終端2解鎖后,在終端1或2可加讀出鎖,在讀出鎖狀態(tài)終端1或2的運(yùn)行不需要等待,因?yàn)樽x出鎖是處于共享狀態(tài),請(qǐng)編寫程序并測試程序運(yùn)行的結(jié)果。2. 分析主程序先用open函數(shù)打開文件“5-11file”,如果該文件不存在,則創(chuàng)建此文件;接著調(diào)用自定義函數(shù)lock_set:先傳遞參數(shù)“F_WRLCK”給文件“5-11file”加鎖,并打印輸出給文件加鎖進(jìn)程的進(jìn)程號(hào),然后先傳遞參數(shù)“F_UNLCK”給文件“5-11file”解鎖,并打印輸出給文件解鎖進(jìn)程的進(jìn)程號(hào);在自定義函數(shù)lock_set給文件上鎖語句前,加上判斷文件是否上鎖的語句,如果文件已經(jīng)被上鎖,打
9、印輸出給文件上鎖進(jìn)程的進(jìn)程號(hào)。3. 編寫C語言程序4. 執(zhí)行程序終端1:加上寫入鎖的是: 5403釋放強(qiáng)制性鎖: 5403文件已加上寫入鎖,其進(jìn)程號(hào)是: 5404文件已加上寫入鎖,其進(jìn)程號(hào)是: 5404文件已加上寫入鎖,其進(jìn)程號(hào)是: 5404加上讀取鎖的是: 5403釋放強(qiáng)制性鎖: 5403終端2:文件已加上寫入鎖,其進(jìn)程號(hào)是: 5403文件已加上寫入鎖,其進(jìn)程號(hào)是: 5403文件已加上寫入鎖,其進(jìn)程號(hào)是: 5403加上寫入鎖的是: 5404釋放強(qiáng)制性鎖: 5404加上讀取鎖的是: 5404釋放強(qiáng)制性鎖: 54045、 流文件的打開和關(guān)閉帶緩存的流文件I/O操作,是基于輸入/輸出(I/O)流機(jī)
10、制的文件操作,又做文件流()的操作。下面具體說明文件流的關(guān)閉與打開。1. 題目要求設(shè)計(jì)一個(gè)程序,要求用流文件I/O操作打開文件“5-12file”, 如果該文件不存在,則創(chuàng)建此文件。2. 題目分析帶緩存的基于輸入/輸出(I/O)流機(jī)制的文件操作時(shí),打開文件用fopen函數(shù),關(guān)閉文件用fclose函數(shù)。3. 程序編寫4. 運(yùn)行結(jié)果可以看到程序運(yùn)行后創(chuàng)建了”5-12file”文件6、 實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),我掌握了Linux下用C語言讀寫文件的方法,包括帶緩存和不帶緩存的方法。另外也學(xué)會(huì)了用C語言修改文件權(quán)限等知識(shí)點(diǎn)??梢钥闯鯨inux和C語言是渾然一體地,可以用C語言無縫地操作Linux系統(tǒng)。實(shí)
11、 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)四進(jìn)程控制實(shí)驗(yàn)日期第14周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)繕?biāo)1. 理解進(jìn)程的基本概念及進(jìn)程的結(jié)構(gòu)2. 學(xué)會(huì)Linux環(huán)境下進(jìn)程的相關(guān)函數(shù)的應(yīng)用3. 掌握守護(hù)進(jìn)程的概念、啟動(dòng)和建立4. 掌握進(jìn)程操作程序的編寫二、 進(jìn)程簡介進(jìn)程是正在執(zhí)行中的程序。當(dāng)我們?cè)诮K端執(zhí)行命令時(shí),Linux 就會(huì)建立一個(gè)進(jìn)程,而當(dāng)我們的程序執(zhí)行完成時(shí),這個(gè)進(jìn)程就被終止了。Linux是一個(gè)多任務(wù)操作系統(tǒng),允許多個(gè)用戶使用計(jì)算機(jī)系統(tǒng),多個(gè)進(jìn)程并發(fā)執(zhí)行。 Linux環(huán)境下啟動(dòng)進(jìn)程有兩種主要途徑:手工啟動(dòng)和調(diào)度啟動(dòng)。3、 程序顯示進(jìn)程號(hào)和父進(jìn)程號(hào)在Linux環(huán)境
12、下進(jìn)程創(chuàng)建時(shí),系統(tǒng)會(huì)分配一個(gè)唯一的數(shù)值給每個(gè)進(jìn)程,這個(gè)數(shù)值就稱為進(jìn)程標(biāo)識(shí)符(PID)。在Linux中進(jìn)程標(biāo)識(shí)有進(jìn)程號(hào)(PID)和它的父進(jìn)程號(hào)(PPID)。其中,PID唯一地標(biāo)識(shí)一個(gè)進(jìn)程。PID和PPID都是非零的正整數(shù)。在Linux中獲得當(dāng)前進(jìn)程的PID和PPID的系統(tǒng)調(diào)用為getpid和getppid函數(shù)。1. 程序編寫2. 編譯運(yùn)行可看到,每次運(yùn)行的pid都是不同的。4、 子進(jìn)程的創(chuàng)建進(jìn)程調(diào)用fork函數(shù)創(chuàng)建一個(gè)新進(jìn)程,由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程(child process)。該函數(shù)被調(diào)用一次,但返回兩次,兩次返回的區(qū)別是子進(jìn)程的返回值是0,而父進(jìn)程的返回值則是新子進(jìn)程的進(jìn)程PID
13、。子進(jìn)程和父進(jìn)程繼續(xù)執(zhí)行fork之后的指令。子進(jìn)程是父進(jìn)程的復(fù)制品。例如,子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。注意,這是子進(jìn)程所擁有的拷貝。父、子進(jìn)程并不共享這些存儲(chǔ)空間部分,通常父、子進(jìn)程共享代碼段1. 編寫C語言程序2. 運(yùn)行程序5、 進(jìn)程的退出1. 題目要求設(shè)計(jì)一個(gè)程序,要求子進(jìn)程和父進(jìn)程都在顯示輸出一些文字后分別用exit和_exit函數(shù)終止進(jìn)程。2. 題目分析由于printf函數(shù)使用的是緩沖I/O方式,遇到”n”時(shí)自動(dòng)將數(shù)據(jù)從緩沖區(qū)讀出??梢钥闯?,調(diào)用exit函數(shù)時(shí),緩沖區(qū)中的記錄能正常輸出;而調(diào)用_exit時(shí),緩沖區(qū)中的記錄無法輸出。Linux標(biāo)準(zhǔn)函數(shù)庫中,有一種操作稱為“緩
14、沖I/O”,每次讀寫文件時(shí),都是在緩沖區(qū)里讀取、寫入。寫入文件時(shí),等滿足一定條件才將緩沖區(qū)的內(nèi)容一次性寫入文件。但是,有時(shí)沒有滿足選定的條件,數(shù)據(jù)只存在緩沖區(qū)內(nèi),如果這時(shí)調(diào)用_exit函數(shù)直接關(guān)閉進(jìn)程,緩沖區(qū)中的數(shù)據(jù)就會(huì)丟失。3. 程序編寫4. 程序執(zhí)行可以看到,程序只在父進(jìn)程進(jìn)行了輸出。這是因?yàn)樽舆M(jìn)程調(diào)用了_exit()函數(shù),沒有進(jìn)行緩沖區(qū)IO的刷新。6、 實(shí)驗(yàn)總結(jié)通過本次試驗(yàn),我了解了Linux的進(jìn)程機(jī)制,學(xué)會(huì)了基本的進(jìn)程創(chuàng)建,進(jìn)程終止,學(xué)會(huì)了在Linux下用C語言操作進(jìn)程。了解到了Linux是一個(gè)多任務(wù)操作系統(tǒng),允許我們使用計(jì)算機(jī)系統(tǒng),多個(gè)進(jìn)程并發(fā)執(zhí)行。實(shí) 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)
15、驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)五線程練習(xí)實(shí)驗(yàn)日期第15周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)康?#216; 了解線程的基本概念Ø 掌握線程相關(guān)函數(shù)及應(yīng)用Ø 理解線程同步互斥二、 線程概述線程定義為進(jìn)程內(nèi)一個(gè)執(zhí)行單元或一個(gè)可調(diào)度實(shí)體。在不擁有線程的進(jìn)程概念中,進(jìn)程既是一個(gè)擁有資源的獨(dú)立單位,它可獨(dú)立分配虛地址空間、主存和其它,又是一個(gè)可獨(dú)立調(diào)度和分派的基本單位。在有了線程以后,資源擁有單位稱為進(jìn)程(或任務(wù)),調(diào)度的單位稱為線程、又稱輕進(jìn)程(Light Weight Process,LWP)。多線程的進(jìn)程在同一地址空間內(nèi)包括多個(gè)不同的控制流,也即屬于同一進(jìn)程下的線程,它們共
16、享進(jìn)程擁有的資源,如代碼、數(shù)據(jù)、文件等。線程也獨(dú)占一些資源,如堆棧、程序計(jì)數(shù)器等。多線程系統(tǒng)的優(yōu)點(diǎn)包括對(duì)用戶響應(yīng)的改進(jìn),進(jìn)程內(nèi)的資源共享,以及利用多處理器體系結(jié)構(gòu)的便利。從實(shí)現(xiàn)的角度看,把線程分為用戶級(jí)線程和內(nèi)核級(jí)線程。用戶級(jí)線程對(duì)程序員來說是可見的,而對(duì)內(nèi)核來說是未知的,用戶空間的線程庫通常用以管理用戶級(jí)線程,線程庫提供對(duì)線程創(chuàng)建、調(diào)度和管理的支持。內(nèi)核級(jí)線程由操作系統(tǒng)支持和管理,在內(nèi)核空間實(shí)現(xiàn)線程創(chuàng)建、調(diào)度和管理。用戶級(jí)線程與內(nèi)核級(jí)線程相比,優(yōu)點(diǎn)是創(chuàng)建和管理要更快;缺點(diǎn)是得到CPU的時(shí)間更少,當(dāng)一個(gè)線程阻塞時(shí),連累其它線程全部阻塞。三、 共享內(nèi)存變量訪問中沖突的現(xiàn)象1. 關(guān)于線程同步與互斥
17、當(dāng)并發(fā)執(zhí)行的線程共享數(shù)據(jù)時(shí),各線程會(huì)改寫共享的數(shù)據(jù),由于CPU調(diào)度順序的不確定性,造成線程運(yùn)行結(jié)果的不確定性。所以,必須為共享數(shù)據(jù)的一組相互協(xié)作的線程提供互斥。一種思想是確保在任何時(shí)刻最多只能有一個(gè)線程執(zhí)行這些訪問共享數(shù)據(jù)的代碼。這就是臨界區(qū)互斥問題。線程在并發(fā)執(zhí)行時(shí)為了保證結(jié)果的可再現(xiàn)性,各線程執(zhí)行序列必須加以限制以保證互斥地使用臨界資源,相互合作完成任務(wù)。多個(gè)相關(guān)線程在執(zhí)行次序上的協(xié)調(diào)稱為線程同步。用于保證多個(gè)線程在執(zhí)行次序上的協(xié)調(diào)關(guān)系的相應(yīng)機(jī)制稱為線程同步機(jī)制。Pthread線程庫提供了多種方式來處理線程同步互斥機(jī)制,最常用的是互斥鎖、條件變量和信號(hào)量。2. C語言程序編寫3. 程序執(zhí)行
18、編譯并運(yùn)行程序:結(jié)果是10 。我們創(chuàng)建兩個(gè)線程,counter的初值為0,各自把counter增加10次,正常情況下最后counter應(yīng)該等于20 四、實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),我學(xué)會(huì)了在Linux下使用C語言操作線程的方法,了解了線程和進(jìn)程的區(qū)別,對(duì)于理解Linux的核心非常有幫助。實(shí) 驗(yàn) 報(bào) 告組別姓名張正錕同組實(shí)驗(yàn)者實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)六網(wǎng)絡(luò)編程實(shí)驗(yàn)日期第16周周四9,10節(jié)教師評(píng)語實(shí)驗(yàn)成績指導(dǎo)教師一、 實(shí)驗(yàn)?zāi)繕?biāo)Ø 理解端口及Socket的基本概念Ø 掌握面向連接的TCP編程Ø 掌握面向非連接的UDP編程Ø 了解/O多路利用的控制Ø 了解復(fù)雜網(wǎng)絡(luò)
19、程序的實(shí)現(xiàn)二、 協(xié)議概述1. TCP/IP協(xié)議TCP/IP協(xié)議(Transmission Control Protocol/Internet Protocol)叫做傳輸控制/網(wǎng)際協(xié)議,又叫網(wǎng)絡(luò)通信協(xié)議。TCP/IP是20世紀(jì)70年代中期美國國防部為其ARPANET廣域網(wǎng)開發(fā)的網(wǎng)絡(luò)體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),以它為基礎(chǔ)組建的Internet是目前國際上規(guī)模最大的計(jì)算機(jī)網(wǎng)絡(luò)。正因?yàn)镮nternet的廣泛使用,使得TCP/IP成了事實(shí)上的標(biāo)準(zhǔn)。TCP/IP雖然叫傳輸控制協(xié)議(TCP)和網(wǎng)際協(xié)議(IP),但實(shí)際上是一組協(xié)議,它包含了上百個(gè)功能的協(xié)議,如ICMP、RIP、TELNET、ARP、TFTP等,這些協(xié)
20、議一起被稱為TCP/IP協(xié)議。2. UDP和TCP協(xié)議TCP與UDP是兩種不同的網(wǎng)絡(luò)傳輸方式。兩個(gè)不同計(jì)算機(jī)中的程序,使用IP地址和端口,要使用一種約定的方法進(jìn)行數(shù)據(jù)傳輸。主要的區(qū)別是進(jìn)行數(shù)據(jù)傳輸時(shí)是否進(jìn)行連接。TCP:TCP是一種面向連接的網(wǎng)絡(luò)傳輸方式。這種方式可以理解為打電話。計(jì)算機(jī)A先呼叫計(jì)算機(jī)B,計(jì)算機(jī)B接受連接后發(fā)出確認(rèn)信息,計(jì)算機(jī)A收到確認(rèn)信息以后發(fā)送信息,計(jì)算機(jī)B完成數(shù)據(jù)接收以后發(fā)送完畢信息,這時(shí)再關(guān)閉數(shù)據(jù)連接。所以TCP是面向連接的可靠的信息傳輸方式。這種方式是可靠的,缺點(diǎn)是傳輸過程復(fù)雜,需要占用較多的網(wǎng)絡(luò)資源。UDP:UDP是一種不面向連接的傳輸方式??梢院喺吕斫獬舌]寄信件。
21、將信件封裝放入郵筒以后,不再參預(yù)郵件的傳送過程。使用UDP傳送信息時(shí),不建立連接,直接把信息發(fā)送到網(wǎng)絡(luò)上,由網(wǎng)絡(luò)完成信息的傳送。信息傳遞完成以后也不發(fā)送確認(rèn)信息。這種傳輸方式是不可靠的,但是有很好的傳輸效率。對(duì)傳輸可靠性要求不高時(shí),可以選擇使用這種傳輸方式。3. 套接字Socket是網(wǎng)絡(luò)編程的一種接口,它是一種特殊的I/O。在TCP/IP協(xié)議中,“IP地址+TCP或UDP端口號(hào)”可以唯一標(biāo)識(shí)網(wǎng)絡(luò)通訊中的一個(gè)進(jìn)程,可以簡單地認(rèn)為:“IP地址+端口號(hào)”就稱為socket。在TCP協(xié)議中,建立連接的兩個(gè)進(jìn)程各自有一個(gè)socket來標(biāo)識(shí),這兩個(gè)socket組成的socket對(duì)就唯一標(biāo)識(shí)一個(gè)連接。用so
22、cket函數(shù)建立一個(gè)socket連接,此函數(shù)返回一個(gè)整型的socket描述符,隨后進(jìn)行數(shù)據(jù)傳輸。一個(gè)完整的socket有一個(gè)本地唯一的socket號(hào),由操作系統(tǒng)分配。最重要的是,socket 是面向客戶/服務(wù)器模型而設(shè)計(jì)的。通常,socket分為三種類型:流式socket、數(shù)據(jù)報(bào)socket和原始socket。注意:一個(gè)完整的socket有一個(gè)本地唯一的socket號(hào),由操作系統(tǒng)分配。最重要的是,socket 是面向客戶/服務(wù)器模型而設(shè)計(jì)的。三、 設(shè)計(jì)服務(wù)器-客戶端通信程序1. 編寫服務(wù)端程序#include <netinet/in.h> / for sockaddr_in#inc
23、lude <sys/types.h> / for socket#include <sys/socket.h> / for socket#include <stdio.h> / for printf#include <stdlib.h> / for exit#include <string.h> / for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/#de
24、fine HELLO_WORLD_SERVER_PORT 6666 #define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define 512 int main(int argc, char *argv) /設(shè)置一個(gè)socket地址結(jié)構(gòu)server_addr,代表服務(wù)器internet地址, 端口 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr); /把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0 server_addr.sin_family = A
25、F_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); /創(chuàng)建用于internet的流協(xié)議(TCP)socket,用server_socket代表服務(wù)器socket int server_socket = socket(PF_INET,SOCK_STREAM,0); if( server_socket < 0) printf("Create Socket Failed!"); exit(1); int
26、opt =1; setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt); /把socket和socket地址結(jié)構(gòu)聯(lián)系起來 if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr) printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1); /server_socket用于監(jiān)聽 if ( listen(ser
27、ver_socket, LENGTH_OF_LISTEN_QUEUE) ) printf("Server Listen Failed!"); exit(1); while (1) /服務(wù)器端要一直運(yùn)行 /定義客戶端的socket地址結(jié)構(gòu)client_addr struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); /接受一個(gè)到server_socket代表的socket的一個(gè)連接 /如果沒有連接請(qǐng)求,就等待到有連接請(qǐng)求-這是accept函數(shù)的特性 /accept函數(shù)返回一個(gè)新的socke
28、t,這個(gè)socket(new_server_socket)用于同連接到的客戶的通信 /new_server_socket代表了服務(wù)器和客戶端之間的一個(gè)通信通道 /accept函數(shù)把連接到的客戶端信息填寫到客戶端的socket地址結(jié)構(gòu)client_addr中 int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0) printf("Server Accept Failed!n"); br
29、eak; char bufferBUFFER_SIZE; bzero(buffer, BUFFER_SIZE); length = recv(new_server_socket,buffer,BUFFER_SIZE,0); if (length < 0) printf("Server Recieve Data Failed!n"); break; char ; bzero(, ); strncpy(, buffer, strlen(buffer)>(buffer);/ int fp = open(, O_RDONLY);/ if( fp < 0 ) pri
30、ntf("%sn",); FILE * fp = fopen(,"r"); if(NULL = fp ) printf("File:t%s Not Foundn", ); else bzero(buffer, BUFFER_SIZE); int = 0;/ while( ( = read(fp,buffer,BUFFER_SIZE)>0) while( ( = fread(buffer,sizeof(char),BUFFER_SIZE,fp)>0) printf(" = %dn",); /發(fā)送buffe
31、r中的字符串到new_server_socket,實(shí)際是給客戶端 if(send(new_server_socket,buffer,)<0) printf("Send File:t%s Failedn", ); break; bzero(buffer, BUFFER_SIZE); / close(fp); fclose(fp); printf("File:t%s Transfer Finishedn",); /關(guān)閉與客戶端的連接 close(new_server_socket); /關(guān)閉監(jiān)聽用的socket close(server_socket)
32、; return 0;2. 編寫客戶端程序#include <netinet/in.h> / for sockaddr_in#include <sys/types.h> / for socket#include <sys/socket.h> / for socket#include <stdio.h> / for printf#include <std
33、lib.h> / for exit#include <string.h> / for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/ #define HELLO_WORLD_SERVER_PORT
34、160; 6666 #define BUFFER_SIZE 1024#define 512 int main(int argc, char *argv) if (argc != 2) printf("Usage: ./%s ServerIPAddressn",argv0); exit(1
35、); /設(shè)置一個(gè)socket地址結(jié)構(gòu)client_addr,代表客戶機(jī)internet地址, 端口 struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr); /把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0 client_addr.sin_family = AF_INET;
36、160; /internet協(xié)議族 client_addr.sin_addr.s_addr = htons(INADDR_ANY);/INADDR_ANY表示自動(dòng)獲取本機(jī)地址 client_addr.sin_port = htons(0); /0表示讓系統(tǒng)自動(dòng)分配一個(gè)空閑端口 /創(chuàng)建用于internet的流協(xié)議(TCP)socket,用client_socket代表客戶機(jī)socket
37、160; int client_socket = socket(AF_INET,SOCK_STREAM,0); if( client_socket < 0) printf("Create Socket Failed!n"); exit(1);
38、160; /把客戶機(jī)的socket和客戶機(jī)的socket地址結(jié)構(gòu)聯(lián)系起來 if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr) printf("Client Bind Port Failed!n");
39、60; exit(1); /設(shè)置一個(gè)socket地址結(jié)構(gòu)server_addr,代表服務(wù)器的internet地址, 端口 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr); server_addr.
40、sin_family = AF_INET; if(inet_aton(argv1,&server_addr.sin_addr) = 0) /服務(wù)器的IP地址來自程序的參數(shù) printf("Server IP Address Error!n"); exit(1);
41、160; server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); /向服務(wù)器發(fā)起連接,連接成功后client_socket代表了客戶機(jī)和服務(wù)器的一個(gè)socket連接 if(connect(client_socket,(struct sockadd
42、r*)&server_addr, server_addr_length) < 0) printf("Can Not Connect To %s!n",argv1); exit(1); char ;
43、160; bzero(, ); printf("Please Input On Server:t"); scanf("%s", ); char bufferBUFFER_SIZE; bzero(buffer,BUFFER_SIZE); strncpy(buff
44、er, , strlen()>BUFFER_SIZE?BUFFER_SIZE:strlen(); /向服務(wù)器發(fā)送buffer中的數(shù)據(jù) send(client_socket,buffer,BUFFER_SIZE,0); / int fp = open(, O_WRONLY|O_CREAT);/ if( fp < 0 ) FILE * fp = fopen(,"
45、;w"); if(NULL = fp ) printf("File:t%s Can Not Open To Writen", ); exit(1); /從服務(wù)器接收數(shù)據(jù)到buffer中 bzero(buffer,BUFFER_SIZE); int length = 0; while( length = recv(client_socket,buff
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度湖南省勞動(dòng)合同(教育行業(yè))
- 離婚房產(chǎn)公證協(xié)議書
- 住宿服務(wù)合同書
- 企業(yè)環(huán)保技術(shù)創(chuàng)新及綠色制造戰(zhàn)略規(guī)劃
- 民用建筑施工合同
- 旅游度假村開發(fā)建設(shè)合同
- 企業(yè)可持續(xù)發(fā)展成本效益分析
- 大數(shù)據(jù)平臺(tái)建設(shè)委托代理協(xié)議
- 股份轉(zhuǎn)讓意向合同
- 三農(nóng)用無人機(jī)使用及維護(hù)指南
- 2025年安徽職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫一套
- 開啟新征程??點(diǎn)亮新學(xué)期+課件=2024-2025學(xué)年高一下學(xué)期開學(xué)家長會(huì)
- 壓力容器考試審核考試題庫(容標(biāo)委氣體協(xié)會(huì)聯(lián)合)
- 人教版(2025版)七年級(jí)下冊(cè)英語UNIT 1 Animal Friends 單元整體教學(xué)設(shè)計(jì)(6個(gè)課時(shí))
- 2025年春季學(xué)期學(xué)校德育工作計(jì)劃及安排表
- 2025年山東商務(wù)職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 海洋自主無人系統(tǒng)跨域協(xié)同任務(wù)規(guī)劃模型與技術(shù)發(fā)展研究
- 校園體育活動(dòng)的多元化與健康促進(jìn)
- 新中式養(yǎng)生知識(shí)培訓(xùn)課件
- 山東省臨沂市地圖矢量課件模板()
- 學(xué)習(xí)2025年全國教育工作會(huì)議心得體會(huì)
評(píng)論
0/150
提交評(píng)論