天天看點

服務端程式設計示例|學習筆記服務端程式設計示例

開發者學堂課程【TCP/IP 網絡基礎:服務端程式設計示例】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/791

服務端程式設計示例

内容簡介

一、用c語言編寫一個TDP和UDP伺服器和用戶端的程式

二、用TCP協定去編寫用戶端和伺服器的程式

三、編寫用戶端的程式

如下圖的Demo,這是使用TCP協定用戶端和伺服器進行的一個通信。

服務端程式設計示例|學習筆記服務端程式設計示例

四個Demo,TCP,直接運作一個伺服器的程式,打開另外一個用戶端,兩個視窗的提示就是兩個不同的程序,這裡進行一下TCP的用戶端的程式。

實作用戶端發送資訊到服務端的功能,服務端接收并顯示收到内容,并把收到内容再次發送給用戶端。

如果想要退出,用exit就可以退出了。

服務端程式設計示例|學習筆記服務端程式設計示例

主要用c語言,建立一個檔案夾,重頭開始編寫,建立一個檔案。

在編寫之前,需要用到一些檔案,系統庫的檔案或者是socket的檔案。

服務端程式設計示例|學習筆記服務端程式設計示例

第一個定義請求隊列的個數,第二個是格式的大小。接下來寫main函數,參數是空。首先需要定義socket,直接用socket函數,因為是TCP的Demo,是以用流式的socket string,socket就定義完成。

定義socket資訊結構體,用sockaddr定義。然後進行填充,有三個成員。列一個參數綁定端口号,随意寫一個8887。

調用一個轉換函數,寫本機的IP位址。先退出來,在系統上填寫一個指令,列印所有的IP資訊,位址:192.168.86.129

根據實力情況看,然後填充進去,第三步是bind綁定,成功是0,不成功是-1。

現在做一個出錯的判斷,我們可以直接在if裡面判斷bind内容。如下圖。

服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例

列印一下資訊,這裡是bind出錯,退出程式,錯誤碼寫1,填充一下參數。第一個是socket的檔案描述,第二個參數是socket資訊結構體,需要取一下位址,

這裡參數的類型是socket string,轉換一下,轉換成sockadd類型。然後對已經初始化完成結構體進行取位址,最後填充大小。

下一步就是listen監聽,把初始化完成的socket操作換成監聽socket,成功傳回0,不成功傳回-1。

同樣進行出錯的判斷,如果listen裡面的東西執行後等于負一,同樣列印一下出錯的資訊,屬于listen出錯,然後退出。

填充一下listen裡面的内容,主要有兩個參數。一個是socket檔案描述符,第二個人監聽隊列的大小,那麼監聽函數就寫好了。

初始化一下用戶端的socket資訊結構體,收發資料後,也需要buffer存儲,同樣也需要一個buffer。先定義一個buffer,資料大小就填已經定義完成的buffer size。接着定義用戶端的socket資訊結構體,可以直接定義大小,同樣用sizeof函數儲存bind裡面。

定義完成sizeof函數,調用完成後傳回socket檔案描述符,然後用socket檔案描述符去收發資料,并填寫參數。第一個參數申請好的server socket。第二個是是用戶端的socket資訊結構體,進行類型轉化。第三個參數是位址。

同樣進行出錯判斷,如果出錯就列印一下,然後傳回一下出錯碼

資料的收發。

運用well進行資料的收發,首先在收發裡把buffer清空,用memset函數清零,再填大小。然後可以調用函數接收資料,傳回值就是接受到一個字母數。

第一個參數就是socket檔案描述符,第二個參數是buffer,第三個參數是buffer大小,第四個參數是如圖。

當用戶端接收exit時可以退出,具體操作如下圖。放輸入exit按回車,其實加了while函數。

資料顯示到終端上,第一個參數是buffer,第二個參數是内容,希望把buffer裡的資料顯示出來,顯示到标準輸出。把資料重新發回給用戶端,調用send函數,這裡資料的收發,在while裡。

如果接收到用戶端發的exit,退出需要把socket關閉,同時把初始socket關閉,即server socket,最後return,完成TCP用戶端的Demo的編寫。

編譯用gcc,檢查錯誤。反複編譯,確定正确。

三、編寫用戶端的程式。

服務端程式設計示例|學習筆記服務端程式設計示例
服務端程式設計示例|學習筆記服務端程式設計示例

可以把之前的檔案複制,都是通用的。寫程式不可能每次都正确,需要一邊寫一邊調試。再起一個檔案,把之前的檔案複制過來,不需要重複操作。寫一個main函數,第一步定義一個socket,定義一下socket資訊結構體,這裡填寫伺服器的資訊,對旁邊的site進行清空,然後填充裡面的成員,首先是協定圖,然後是端口号,最後是IP位址。

下一步連接配接伺服器,用connect函數,這裡做出錯判斷,如果為0,就退出并列印錯誤資訊,這裡再填充一下參數,填寫伺服器的socket資訊結構體,同樣要先轉化為socksaddr類型,最後對結構體大小進行測量,這個函數就完成。

下一步資料收發環節,首先定義一下buffer的接收和發送。進行資料收發,寫一個while循環,用gets持續循環判斷,如果gets裡不為空,進行收發。标準輸入内容儲存,然後獲得資料發送,填寫socket檔案描述符,然後從sendbuf裡擷取資料,資料大小就是實際内容大小,可以用strien進行測量。接着寫判斷,如果接收比對,就退出程式,伺服器會把從用戶端收到的東西轉發回來,用recv接收。裡面的參數跟send參數一樣,不同的是收到recvbuf裡,收到東西列印到fputs裡。因為循環,是以recvbuf和sendbuf的内容要進行清空。那麼接收exit退出後,退出了循環,并關閉socket,進行close函數。

現在進行編譯是否程式完成,再驗證。

先讓程式運作,把另外一個服務端程式給執行,接受到後正常退出。這裡完成TCP用戶端和伺服器Demo的編寫。

下面進行UDP用戶端和伺服器程式的編寫。

首先看一下小的Demo,先執行服務端的程式,再執行用戶端的程式。可以看到服務端收到的是用戶端發給它的,寫一個while循環完成資料的收發。

到udpserver裡檢視,編寫更加簡潔,不需要監聽等内容,其他檔案一樣。

然後看一下main函數,首先定義socket檔案描述符,用的是socketdgram,初始化後,進行判斷,判斷内容同上。

然後定義兩個socket結構體。serveraddress要對它清空。填充完,用buffer函數對它進行綁定。

然後進行出錯判斷,出錯後退出。然後定義一個recvbuffer,對它進行清零,這裡調用recvfrom函數,跟前面不同。這個函數前面幾個參數差不多,接收用戶端socket資訊結構體。

用print列印接收到的資訊,告訴服務端用戶端收到消息,調用sendto和recvfrom的參數差不多。轉發完成後,完成資料傳輸。

繼續閱讀