、 1:LED閃爍實驗
1、實驗目的
學習GPIO原理
掌握Z32安全模塊驅動LED的工做原理
2、實驗內容
學習GPIO原理,閱讀《ARM cortex-m0權威手冊》(詳見目錄Z32開發指南\3.參考資料),參考Z32HUA_DEMO工程函數庫(詳見Z32開發指南\2.軟件資料),經過設置GPIO0來控制核心板上L2燈的亮滅。
3、預備知識
有C語言基礎知識
掌握Keil uVision4的開發環境
掌握Z32應用程序的框架結構
4、實驗設備及工具
硬件:信息安全系統設計與應用試驗平臺、USB轉9針串口線、標準雙頭USB鏈接線、配有Win7及以上系統的PC機,硬盤10G以上。
軟件:Keil uVision4開發環境
5、實驗原理
Z32內部支持33個可複用 GPIO 接口,全部IO都支持上、下拉可配置;中斷都支持上升沿觸發、降低沿觸發或雙沿觸發配置,喚醒 IO 支持高低電平觸發;IO 驅動能力不小於4mA,其中2個IO驅動能力很多於12mA。
General Purpose Input Output (通用輸入/輸出)簡稱爲GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或芯片組沒有足夠的I/O端口,或當系統須要採用遠端串行通訊或控制時,GPIO產品可以提供額外的控制和監視功能。
GPIO端口的每一個位能夠由軟件分別配置成多種模式:
輸入浮空
輸入上拉
輸入下拉
模擬輸入
開漏輸出
推輓式輸出
推輓式複用功能
開漏複用功能
GPIO管腳工做模式有3種比較經常使用:高阻輸入、推輓輸出、開漏輸出
1. 高阻輸入(Input)算法
圖1 GPIO高阻輸入模式結構示意圖
爲減小信息傳輸線的數目,大多數計算機中的信息傳輸線採用總線形式,即凡要傳輸的同類信息都在同一組傳輸線,且信息是分時傳送的。在計算機中通常有三組總線,即數據總線、地址總線和控制總線。爲防止信息相互干擾,要求凡掛到總線上的寄存器或存儲器等,它的輸入輸出端不只能呈現0、1兩個信息狀態,並且還應能呈現第三個狀態----高阻抗狀態,即此時好像它們的輸出被開關斷開,對總線狀態不起做用,此時總線可由其餘器件佔用。三態緩衝器便可實現上述功能,它除具備輸入輸出端以外,還有一控制端。
如圖1.1所示,爲GPIO管腳在高阻輸入模式下的等效結構示意圖。這是一個管腳的狀況,其它管腳的結構也是一樣的。輸入模式的結構比較簡單,就是一個帶有施密特觸發輸入(Schmitt-triggered input)的三態緩衝器(U1),並具備很高的輸入等效阻抗。施密特觸發輸入的做用是能將緩慢變化的或者是畸變的輸入脈衝信號整造成比較理想的矩形脈衝信號。執行GPIO管腳讀操做時,在讀脈衝(Read Pulse)的做用下會把管腳(Pin)的當前電平狀態讀到內部總線上(Internal Bus)。在不執行讀操做時,外部管腳與內部總線之間是隔離的。
2. 推輓輸出(Output)編程
圖2 GPIO推輓輸出模式結構示意圖
推輓輸出原理:在功率放大器電路中大量採用推輓放大器電路,這種電路中用兩隻三極管構成一級放大器電路,兩隻三極管分別放大輸入信號的正半周和負半周,即用一隻三極管放大信號的正半周,用另外一隻三極管放大信號的負半周,兩隻三極管輸出的半周信號在放大器負載上合併後獲得一個完整週期的輸出信號。
推輓放大器電路中,一隻三極管工做在導通、放大狀態時,另外一隻三極管處於截止狀態,當輸入信號變化到另外一個半周後,原先導通、放大的三極管進入截止,而原先截止的三極管進入導通、放大狀態,兩隻三極管在不斷地交替導通放大和截止變化,因此稱爲推輓放大器。
如圖1.2所示,爲GPIO管腳在推輓輸出模式下的等效結構示意圖。U1是輸出鎖存器,執行GPIO管腳寫操做時,在寫脈衝(Write Pulse)的做用下,數據被鎖存到Q和/Q。T1和T2構成CMOS反相器,T1導通或T2導通時都表現出較低的阻抗,但T1和T2不會同時導通或同時關閉,最後造成的是推輓輸出。在推輓輸出模式下,GPIO還具備回讀功能,實現回讀功能的是一個簡單的三態門U2。注意:執行回讀功能時,讀到的是管腳的輸出鎖存狀態,而不是外部管腳Pin的狀態。
3. 開漏輸出(OutputOD)安全
圖3 GPIO開漏輸出結構示意圖
如圖1.3所示,爲GPIO管腳在開漏輸出模式下的等效結構示意圖。開漏輸出和推輓輸出相比結構基本相同,但只有下拉晶體管T1而沒有上拉晶體管。一樣,T1實際上也是多組可編程選擇的晶體管。開漏輸出的實際做用就是一個開關,輸出「1」時斷開、輸出「0」時鏈接到GND(有必定內阻)。回讀功能:讀到的還是輸出鎖存器的狀態,而不是外部管腳Pin的狀態。所以開漏輸出模式是不能用來輸入的。
開漏輸出結構沒有內部上拉,所以在實際應用時一般都要外接合適的上拉電阻(一般採用4.7~10kΩ)。開漏輸出可以方便地實現「線與」邏輯功能,即多個開漏的管腳能夠直接並在一塊兒(不須要緩衝隔離)使用,並統一外接一個合適的上拉電阻,就天然造成「邏輯與」關係。開漏輸出的另外一種用途是可以方便地實現不一樣邏輯電平之間的轉換(如3.3V到5V之間),只需外接一個上拉電阻,而不須要額外的轉換電路。典型的應用例子就是基於開漏電氣鏈接的I2C總線。
6、程序分析
本此實驗例程的詳細程序請打開「Z32開發指南\實驗1-LED閃爍」目錄文件夾下的工程文件,下面咱們對程序的主要部分作一下簡單的分析。
打開LED閃爍實驗工程文件,如圖所示:
在user組和driver組下分別雙擊Main.c和Gpio.c,就能夠看到程序的源代碼。
7、實驗步驟
一、打開「Z32開發指南\實驗1-LED閃爍」目錄的工程文件。編譯工程,產生後綴名爲.bin的可執行代碼。
二、下載程序
將實驗箱接入電源,用USB公對公線將實驗箱的USB接口鏈接到電腦的USB接口上,在電腦上找到「Z32開發指南\2.軟件資料\Z32下載調試工具」目錄打開Z32下載調試工具NZDownloadTool.exe。打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。
當左邊框出現「1設備已鏈接」,設備選擇中顯示芯片型號,此時就能夠下載程序了。
點擊「下載」,左邊狀態提示框更新顯示「程序下載成功!」實驗1的程序就下載進Z32的實驗板上了。
8、實驗現象
實驗1的內容是對LED燈的操做,咱們關閉Z32電源開關,再打開,程序自動運行,此時能夠看到實驗現象:Z32核心板上L2燈開始閃爍。
服務器
、2:UART發送與中斷接收實驗
1、實驗目的
學習串口通訊原理
掌握SP3232芯片的使用方法
掌握Z32的串行口工做原理
2、實驗內容
學習串口通訊原理,熟練Z32系統硬件的UART使用方法,編程實現串口通訊的基本收發功能,利用上位機上的串口調試助手觀測發送和收到的數據。
3、預備知識
C語言基礎知識
掌握Keil uVision4的開發環境
Z32應用程序的框架結構
4、實驗設備及工具
硬件:信息安全系統設計與應用試驗平臺、USB轉9針串口線、標準雙頭USB鏈接線、配有Win7及以上系統的PC機,硬盤10G以上。
軟件:Keil uVision4開發環境
5、實驗原理
一、串行接口標準
RS-232接口符合美國電子工業聯盟(EIA)制定的串行數據通訊的接口標準,原始編號全稱是EIA-RS-232(簡稱232,RS232)。目前RS-232是PC機與通訊工業中應用最普遍的一種串行接口。RS-232被定義爲一種在低速率串行通信中增長通信距離的單端標準。RS-232採起不平衡傳輸方式,即所謂單端通信。RS232接口的通信距離小於15 m,傳輸速率小於20 kb/s。RS232標準是按負邏輯定義的,它的「1」電平在-5~-15 V之間,「0」電平在+5~+15 V之間。網絡
在RS-232的通信標準中是以一個25針的接口來定義的,並在早期的計算機如PC或XT機型上普遍使用,但在AT機之後的機型上,實際均採用了9針的簡化版本應用,如今所說的232通信均默認爲9針的接口。圖一顯示了9針通信的接口管腳名稱,如下是各管腳的說明:
表1 9針串口引腳說明
舊制JIS名稱 新制JIS名稱 全稱 說明
FG SG Frame Ground 連到機器的接地線
TXD SD Transmitted Data 數據輸出線
RXD RD Received Data 數據輸入線
RTS RS Request to Send 要求發送數據
CTS CS Clear to Send 迴應對方發送的RTS的發送許可,告訴對方能夠發送
DSR DR Data Set Ready 告知本機在待命狀態
DTR ER Data Terminal Ready 告知數據終端處於待命狀態
CD CD Carrier Detect 載波檢出,用以確認是否收到Modem的載波
SG SG Signal Ground 信號線的接地線(嚴格的說是信號線的零標準線)
如今一般計算機均配有這種標準的232接口,一般這種接口用於聯接鼠標、MODEM或打印機等外部設備。實際應用中,電子工程師在設計計算機與外圍設備的通訊時,一般在9針的基礎再進行簡化,只用其中的二、三、5三個管腳進行通訊。這三個管腳分別是接收線、發送線和地線,在通常狀況下便可知足通信的要求框架
圖2 計算機和外部通信的接線方法
值得注意的是,二、3兩腳是交叉互聯的,這很容易理解,由於一個設備的發送線必須聯接到另一臺設備的接收線上,反之亦然。
對於沒有配有這種標準的232接口的PC機,可是有USB接口,咱們須要使用USB轉9針串口線將PC機和另一臺串口設備鏈接起來,其中USB轉9針串口線起到電平轉換和協議轉換的做用。socket
6、程序分析
本此實驗例程的詳細程序請打開「Z32開發指南\實驗2-UART發送與中斷接收」目錄文件夾下的工程文件,下面咱們對程序的主要部分作一下簡單的分析。
打開LED閃爍實驗工程文件,如圖所示:
在user組和driver組下分別雙擊Main.c和Uart.c,就能夠看到程序的源代碼。
7、實驗步驟
一、打開「Z32開發指南\實驗2-UART發送與中斷接收」目錄的工程文件。編譯工程,產生後綴名爲.bin的可執行代碼。
二、下載程序
將實驗箱接入電源,用USB公對公線將實驗箱的USB接口鏈接到電腦的USB接口上,在電腦上找到「Z32開發指南\2.軟件資料\Z32下載調試工具」目錄打開Z32下載調試工具NZDownloadTool.exe。打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。
當左邊框出現「1設備已鏈接」,設備選擇中顯示芯片型號,此時就能夠下載程序了。
點擊「下載」,左邊狀態提示框更新顯示「程序下載成功!」實驗2的程序就下載進Z32的實驗板上了。
8、實驗現象
實驗2使用串口調試助手(sscom)來觀察串口通訊收發的數據。
咱們用9針串口線將Z32模塊的串口與電腦USB接口鏈接。
首先在電腦上打開串口助手,選擇對應的串口號,設置波特率爲115200,偶校驗(Even),選中「發送新行」,而後打開串口。
關閉Z32電源開關,再打開,程序自動運行,能夠在串口調試助手看到以下實驗現象:顯示「A Welcome to Z32HUA! 1234567890 0xAA」,證實PC機串口已經接收到Z32串口發送來的信息。
咱們在串口調試助手的字符串輸入框輸入字符串「zxm zxm zxm abc」,而後點擊發送按鈕。
這時,能夠看到串口調試助手接收到咱們發送輸入的字符串「zxm zxm zxm abc」,並顯示在串口助手上。
函數
、3:12864液晶屏串行顯示實驗
1、實驗目的
學習12864液晶屏原理
掌握Z32的GPIO工做原理
掌握12864液晶屏的使用方法
2、實驗內容
學習GPIO原理,閱讀《ARM cortex-m0權威手冊》,參考Z32HUA_DEMO工程函數庫(詳見軟件資料),經過設置經過GPIO1,GPIO2,GPIO3串行通訊控制液晶屏,實現字符顯示功能。
3、預備知識
有C語言基礎知識
掌握Keil uVision4的開發環境
掌握Z32應用程序的框架結構
4、實驗設備及工具
硬件:信息安全系統設計與應用試驗平臺、USB轉9針串口線、標準雙頭USB鏈接線、配有Win7及以上系統的PC機,硬盤10G以上。
軟件:Keil uVision4開發環境
5、實驗原理
(一)、概述
12864是一種圖形點陣液晶顯示器。它主要採用動態驅動原理由行驅動—控制器和列驅動器兩部分組成了128(列)×64(行)的全點陣液晶顯示。此顯示器採用了COB的軟封裝方式,經過導電橡膠和壓框鏈接LCD,使其壽命長,鏈接可靠。
(二)、特性
1.工做電壓爲+5V±10% ,可自帶驅動LCD所需的負電壓。
2.全屏幕點陣,點陣數爲128(列)×64(行),可顯示8(/行)×4(行)個(16×16點陣)漢字,也可完成圖形,字符的顯示。
3.與CPU接口採用5條位控制總線和8位並行數據總線輸入輸出,適配M6800系列時序。
4.內部有顯示數據鎖存器。
5.簡單的操做指令,顯示開關設置,顯示起始行設置,地址指針設置和數據讀/寫等指令。工具
1)顯示數據 RAM(DDRAM)
DDRAM(64×8×8 bits)是存儲圖形顯示數據的。此 RAM 的每一位數據對應顯示面板上一個點的顯示(數據爲 H)與不顯示(數據爲 L)。DDRAM 的地址與顯示位置關係對照圖(見附錄一)
2)I/O 緩衝器(DB0~DB7)
I/O 緩衝器爲雙向三態數據緩衝器。是 LCM(液晶顯示模塊)內部總線與 MPU 總線的結合部。其做用是將兩個不一樣時鐘下工做的系統鏈接起來,實現通信。I/O 緩衝器在片選信號/CS有效狀態下,I/O 緩衝器開放,實現 LCM(液晶顯示模塊)與 MPU 之間的數據傳遞。當片選信號爲無效狀態時,I/O 緩衝器將中斷 LCM(液晶顯示模塊)內部總線與 MPU 數據總線的聯繫,對外總線呈高阻狀態,從而不影響 MPU 的其餘數據操做功能。
3)輸入寄存器
輸入寄存器用於接收在 MPU 運行速度下傳送給 LCM(液晶顯示模塊)的數據並將其鎖存在輸入寄存器內,其輸出將在 LCM(液晶顯示模塊)內部工做時鐘的運做下將數據寫入指令寄存器或顯示存儲器內。
4)輸出寄存器
輸出寄存器用於暫存從顯示存儲器讀出的數據,在 MPU 讀操做時,輸出寄存器將當前鎖
存的數據經過 I/O 緩衝器送入 MPU 數據總線上。
5)指令寄存器
指令寄存器用於接收 MPU 發來的指令代碼,經過譯碼將指令代碼置入相關的寄存器或觸
發器內。
6)狀態字寄存器
狀態字寄存器是 LCM(液晶顯示模塊)與 MPU 通信時惟一的「握手」信號。狀態字寄存器向 MPU 表示了 LCM(液晶顯示模塊)當前的工做狀態。尤爲是狀態字中的「忙」標誌位是MPU 在每次對 LCM(液晶顯示模塊)訪問時必需要讀出判別的狀態位。當處於「忙」標誌位時,I/O 緩衝器被封鎖,此時 MPU 對 LCM(液晶顯示模塊)的任何操做(除讀狀態字操做外)都將是無效的。
7)X 地址寄存器
X 地址寄存器是一個三位頁地址寄存器,其輸出控制着 DDRAM 中 8 個頁面的選擇,也是控制着數據傳輸通道的八選一選擇器。X 地址寄存器能夠由 MPU 以指令形式設置。X 地址寄存器沒有自動修改功能,因此要想轉換頁面須要從新設置 X 地址寄存器的內容。
8)Y 地址計數器
Y 地址計數器是一個 6 位循環加一計數器。它管理某一頁面上的 64 個單元。Y 地址計數器能夠由 MPU 以指令形式設置,它和頁地址指針結合惟一選通顯示存儲器的一個單元,Y 地址計數器具備自動加一功能。在顯示存儲器讀/寫操做後 Y 地址計數將自動加一。當計數器加至 3FH 後循環歸零再繼續加一。
9)Z 地址計數器
Z 地址計數器是一個 6 位地址計數器,用於肯定當前顯示行的掃描地址。Z 地址計數器具備自動加一功能。它與行驅動器的行掃描輸出同步,選擇相應的列驅動的數據輸出。
10)顯示起始行寄存器
顯示起始行寄存器是一個 6 位寄存器,它規定了顯示存儲器所對應顯示屏上第一行的行號。該行的數據將做爲顯示屏上第一行顯示狀態的控制信號。
11)顯示開/關觸發器
顯示開/關觸發器的做用就是控制顯示驅動輸出的電平以控制顯示屏的開關。在觸發器輸出爲「關」電平時,顯示數據鎖存器的輸入被封鎖並將輸出置「0」,從而使顯示驅動輸出所有爲非選擇波形,顯示屏呈不顯示狀態。在觸發器輸出爲「開」電平時,顯示數據鎖存器被控制,顯示驅動輸出受顯示驅動數據總線上數據控制,顯示屏將呈顯示狀態。
12)復位端/RES
復位端/RES 用於在 LCM(液晶顯示模塊)上電時或須要時實現硬件電路對 LCM(液晶顯示模塊)的復位。該復位功能將實現:
設置顯示狀態爲關顯示狀態
顯示起始寄存器清零。顯示 RAM 第一行對應顯示屏上的第一行。
在復位期間狀態字中 RESET 位置「1」。 初始化條件:學習
6、程序分析
本實驗例程的詳細程序請打開「Z32開發指南\實驗3 12864液晶屏串行顯示」文件夾下的工程文件,下面咱們對程序的主要部分作一下簡單的分析。
打開12864液晶屏串行顯示實驗工程文件,如圖所示:
而後在user組下分別雙擊Main.c和LCD.c能夠看到主函數代碼和12864液晶屏的函數代碼
7、實驗步驟
一、打開「Z32開發指南\實驗3-12864液晶屏串行顯示」目錄的工程文件。編譯工程,產生後綴名爲.bin的可執行代碼。
二、下載程序
將實驗箱接入電源,用USB公對公線將實驗箱的USB接口鏈接到電腦的USB接口上,在電腦上找到「Z32開發指南\2.軟件資料\Z32下載調試工具」目錄打開Z32下載調試工具NZDownloadTool.exe。打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。
當左邊框出現「1設備已鏈接」,設備選擇中顯示芯片型號,此時就能夠下載程序了。
點擊「下載」,左邊狀態提示框更新顯示「程序下載成功!」實驗3的程序就下載進Z32的實驗板上了。
8、實驗現象
實驗3的內容是LCD12864液晶屏的顯示操做。
關閉Z32電源開關,再打開,程序自動運行,此時能夠看到實驗現象:屏幕上依次顯示如下字符:
「歡迎使用Z32HUA!
LCD12864液晶測試
1.2.3.4.5.6.7.8.
A.B.C.D.E.F.G.H.」
其中行與行之間顯示的間隔時間約爲1.8s,四行字符所有顯示完成後清屏幕,從新循環顯示。
1、實驗目的
學習SM2加解密算法原理,掌握SM2加、解密算法用法
2、實驗內容
學習SM1加密原理,閱讀《ARM cortex-m0權威手冊》和《Z32HUA國密算法庫用戶手冊》(詳見目錄Z32開發指南\3.參考資料),參考Z32HUA_DEMO工程函數庫(詳見Z32開發指南\2.軟件資料),調用SM2加解密函數,實現對數據加解密操做。
3、預備知識
有C語言基礎知識
掌握Keil uVision4的開發環境
掌握Z32應用程序的框架結構
掌握國密SM2加解密算法函數的用法
4、實驗設備及工具
硬件:信息安全系統設計與應用試驗平臺、USB轉9針串口線、標準雙頭USB鏈接線、配有Win7及以上系統的PC機,硬盤10G以上。
軟件:Keil uVision4開發環境、串口調試助手SSCOM4.2。
5、實驗原理
國密SM2是非對稱密碼算法,是基於ECC算法的非對稱算法。SM2算法就是ECC橢圓曲線密碼機制,但在簽名、密鑰交換方面不一樣於ECDSA、ECDH等國際標準,而是採起了更爲安全的機制。另外,SM2推薦了一條256位的曲線做爲標準曲線。
國密SM2算法標準包括4個部分,第1部分爲總則,主要介紹了ECC基本的算法描述,包括素數域和二元擴域兩種算法描述,第2部分爲數字簽名算法,這個算法不一樣於ECDSA算法,其計算量大,也比ECDSA複雜些,也許這樣會更安全吧,第3部分爲密鑰交換協議,與ECDH功能相同,但複雜性高,計算量加大,第4部分爲公鑰加密算法,使用ECC公鑰進行加密和ECC私鑰進行加密算法,其實現上是在ECDH上分散出流密鑰,以後與明文或者是密文進行異或運算,並無採用第3部分的密鑰交換協議產生的密鑰。對於SM2算法的整體感受,應該是國家發明,其計算上比國際上公佈的ECC算法複雜,相對來講算法速度可能慢,但多是更安全一點。
SM2標準還公佈了一條建議的256位的ECC曲線,但沒有在國際上被公認。SM2算法是好,但要使用,又有不少障礙,就是統一的國際標識與互認,如算法沒有OID標識,曲線也沒有公認OID標識,這在通用上就大打折扣了,這一點須要考慮的。
6、程序分析
本此實驗例程的詳細程序請打開「Z32開發指南\實驗9-SM2」目錄文件夾下的工程文件,下面咱們對程序的主要部分作一下簡單的分析。
打開SM2加解密實驗工程文件,如圖所示:
二、下載程序
將實驗箱接入電源,用USB公對公線將實驗箱的USB接口鏈接到電腦的USB接口上,在電腦上找到「Z32開發指南\2.軟件資料\Z32下載調試工具」目錄打開Z32下載調試工具NZDownloadTool.exe。打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。
圖5 Z32下載工具成功鏈接圖
當左邊框出現「1設備已鏈接」,設備選擇中顯示芯片型號,此時就能夠下載程序了。
點擊「下載」,左邊狀態提示框更新顯示「程序下載成功!」實驗8的程序就下載進Z32的實驗板上了。
8、實驗現象
實驗9的內容是SM2加解密實驗。本實驗使用Z32內置函數庫實現加解密算法。
咱們用9針串口線將Z32模塊的串口與電腦USB接口鏈接。
首先在電腦上打開串口助手,選擇對應的串口號,設置波特率爲115200,偶校驗(Even),而後打開串口。
關閉Z32電源開關,再打開,程序自動運行,此時能夠看到實驗現象:12864屏幕上顯示「SM2實驗!請看串口助手」。
在字符串輸入框輸入數據「zxm zxm abc」,點擊發送。
輸入字符串「zxm zxm abc」發送,字符串顯示在串口調試助手上,如圖。
按下矩陣鍵盤「A」鍵,串口調試助手顯示數據「輸入的數據爲:abc」,並提示「按A鍵進行加密」。
按矩陣鍵盤上「A」鍵,加密後的數據顯示在串口調試助手上
再按「A」鍵,進行解密,解密後的數據顯示在串口調試助手上。
從去年的課程中找到了完成過的代碼,直接拿來使用
、 我實現client
、client.c
`#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) { int client_sockfd; int len; struct sockaddr_in remote_addr; //服務器端網絡地址結構體 char buf[BUFSIZ]; //數據傳送的緩衝區 memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零 remote_addr.sin_family=AF_INET; //設置爲IP通訊 remote_addr.sin_addr.s_addr=inet_addr("127.0.0.2");//服務器IP地址 remote_addr.sin_port=htons(8000); //服務器端口號 /*建立客戶端套接字--IPv4協議,面向鏈接通訊,TCP協議*/ if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { perror("socket"); return 1; } /*將套接字綁定到服務器的網絡地址上*/ if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0) { perror("connect"); return 1; } printf("connected to server\n 客戶端IP127.0.0.305\n 服務器實現者學號20155206\n 當前時間2018.5.26\n"); len=recv(client_sockfd,buf,BUFSIZ,0);//接收服務器端信息 buf[len]='\0'; printf("%s",buf); //打印服務器端信息 /*循環的發送接收信息並打印接收信息--recv返回接收到的字節數,send返回發送的字節數*/ while(1) { printf("Enter string to send:"); scanf("%s",buf); if(!strcmp(buf,"quit")) break; len=send(client_sockfd,buf,strlen(buf),0); len=recv(client_sockfd,buf,BUFSIZ,0); buf[len]='\0'; printf("received:%s/n",buf); } close(client_sockfd);//關閉套接字 return 0; } `
、 server.c
`#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) { int server_sockfd;//服務器端套接字 int client_sockfd;//客戶端套接字 int len; struct sockaddr_in my_addr; //服務器網絡地址結構體 struct sockaddr_in remote_addr; //客戶端網絡地址結構體 int sin_size; char buf[BUFSIZ]; //數據傳送的緩衝區 memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零 my_addr.sin_family=AF_INET; //設置爲IP通訊 my_addr.sin_addr.s_addr=INADDR_ANY;//服務器IP地址--容許鏈接到全部本地地址上 my_addr.sin_port=htons(8000); //服務器端口號 /*建立服務器端套接字--IPv4協議,面向鏈接通訊,TCP協議*/ if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { perror("socket"); return 1; } /*將套接字綁定到服務器的網絡地址上*/ if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0) { perror("bind"); return 1; } /*監聽鏈接請求--監聽隊列長度爲5*/ listen(server_sockfd,5); sin_size=sizeof(struct sockaddr_in); /*等待客戶端鏈接請求到達*/ if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0) { perror("accept"); return 1; } printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr)); len=send(client_sockfd,"Welcome to my server\n 客戶端IP127.0.0.3\n 服務器實現者學號20155206\n 當前時間2018.5.26\n",21,0);//發送歡迎信息 /*接收客戶端的數據並將其發送給客戶端--recv返回接收到的字節數,send返回發送的字節數*/ while((len=recv(client_sockfd,buf,BUFSIZ,0))>0) { buf[len]='\0'; printf("%s\n",buf); if(send(client_sockfd,buf,len,0)<0) { perror("write"); return 1; } } close(client_sockfd); close(server_sockfd); return 0; } `
**本次實驗在小組三人的共同努力下完成,可是試驗箱出現問題,兩個實驗模塊不能同時使用,在同時打開使用時下載進去的代碼總有幾段是沒法運行的,導致實驗目前沒法繼續進行下去;同時,今天(2018.6.3)小組內檢查實驗完成狀況時,在用超級終端與試驗箱鏈接時總會不停的自動斷開,而後再次自動鏈接,這個狀況在上次是沒有遇到的,目前沒有解決。**