999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux系統(tǒng)教學中關于套接字文件的解析

2020-11-30 09:02:22趙宏朱忠政孔東一
軟件 2020年9期

趙宏 朱忠政 孔東一

摘? 要: 針對Linux系統(tǒng)相關內容教學中對于套接字文件講述不夠詳細,導致學生對套接字文件認識模糊的問題,基于套接字通信原理,利用實例對比主機之間和進程之間利用套接字通信的差異,說明Linux系統(tǒng)中套接字文件的作用,幫助學生對套接字文件的深入理解。

關鍵詞: Linux系統(tǒng);套接字文件;Socket對象;Python

中圖分類號: TP301? ? 文獻標識碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.09.009

本文著錄格式:趙宏,朱忠政,孔東一. Linux系統(tǒng)教學中關于套接字文件的解析[J]. 軟件,2020,41(09):3335

【Abstract】: Most university students have the vague knowledge of socket file in Linux learning because the detailed explain about this file is absent in Linux teaching files. Based on the principle of socket communication, the differences between hosts and between processes are compared using examples, and the function of socket file in Linux is explained. Therefore, students will gain an in-depth understanding in socket file.

【Key words】: Linux system; Socket file; Socket object; Python

0? 引言

Linux系統(tǒng)作為開放源代碼和自由軟件的代表,廣泛應用在各行各業(yè),運行在各種機型和硬件平臺上[1-2]。Linux系統(tǒng)符合POSIX(Portable Operating System Interface)標準,功能強大,效率高,配置靈活,安全性高,且具有豐富的工具軟件和應用軟件,其相關內容在大多數高校信息類專業(yè)中作為專業(yè)基礎課開設[3-4],例如《Linux操作系統(tǒng)》、《Linux系統(tǒng)內核分析》、《Linux系統(tǒng)程序設計》等。

在Linux系統(tǒng)相關內容教學中,Linux系統(tǒng)中的文件類型是基本內容,大多數教科書列舉了Linux中的文件類型,包括普通文件(-)、目錄文件(d)、字符設備文件(c)、塊設備文件(b)、符號鏈接文件(l)、命名管道文件(p)和套接字文件(s)等七種文件類型[1,4],對于前五種文件,一般都進行詳細講解,并用實例加以說明。但對于后兩種文件,只是進行簡單的描述,沒有實例的說明,導致學生在學習中,對于命名管道文件和套接字文件的認識很模糊,不利于對Linux系統(tǒng)的深刻理解。

文獻[5]詳細介紹了命名管道文件的功能和實際應用實例,本文首先介紹主機間通過套接字通信的機制和實例,然后討論進程間通過套接字通信的方式,并通過實例進行詳細說明,加深學生對套接字文件的認識。

1? 套接字介紹

網絡上的主機之間通過IP地址與端口號進行通信,稱為套接字(Socket)通信[6]。TCP/IP協(xié)議簇中應用層的HTTP、FTP、DNS等都是通過套接字通信實現的。套接字通信中,提供服務的一端稱為套接字服務端,調用套接字服務的一端稱為套接字客戶端。套接字服務端首先用自己的IP地址、指定端口號和連接方式創(chuàng)建服務并啟動服務,監(jiān)聽來自客戶端的連接請求;套接字客戶端向服務端發(fā)起連接請求,連接請求被服務端接受后,雙方就可以進行通信。

主機之間通過套接字進行通信時,無論是服務端還是客戶端,都需要創(chuàng)建socket對象,并設置family參數和type參數。利用Python語言創(chuàng)建socket對象的語句格式如下。

s = socket.socket(family參數, type參數)

其中,s表示創(chuàng)建的socket對象;socket.socket()表示調用socket模塊的socket()函數;family參數如表1所示,表示主機之間的網絡連接方式;type參數如表2所示,表示主機之間通信時所使用的傳輸協(xié)議。

2? 主機之間通過套接字通信實例

本實例中,服務端將來自客戶端的字符串中的字母轉換為大寫的服務。

假設服務端IP地址為192.168.3.13,在服務端創(chuàng)建Python程序文件,socket_s.py,代碼如下。

1 #!/usr/bin/env python3

2 # coding: utf-8

3 import socket

4 s = socket.socket(socket.AF_INET, socket. SOCK_STREAM)

5 s.bind(('192.168.3.13', 8088))

6 s.listen(1)

7 print('Wait for connecting...')

8 (conn,addr)=s.accept()

9 print('conn=',conn)

10 print('addr=',addr)

11 while True:

12? ? str1=conn.recv(1024)

13? ? str2=str(str1,encoding='utf-8')

14? ? print('I received a string is: ',str2)

15? ? str3=str2.upper()

16? ? conn.send(str3.encode('utf-8'))

17? ? if str2 =='.' :

18? ? ? ? break

19 conn.close()

20 s.close()

代碼前的行號是為敘述方便而加,以#開頭的代碼為注釋,不實際執(zhí)行。

程序第3行引入socket模塊。第4行構造socket對象s,family參數為socket.AF_INET,表示主機之間使用IPv4地址通信,type參數為socket.SOCK_ STREAM,表示使用TCP傳輸協(xié)議。第5行調用函數bind()將對象s綁定到元組('192.168.3.13', 8088)表示的地址上,其中'192.168.3.13'為服務端IP地址,8088為端口號。第6行調用函數listen()開始監(jiān)聽來自客戶端的連接,參數為1表示只接受1個連接。第8行調用函數accept()接受一個來自客戶端的連接,返回元組(conn,addr),其中,conn也是一個socket對象,用來與客戶端通信,addr為元組變量,保存客戶端的IP地址和端口號。第11行至18行的循環(huán)使用conn通過函數recv()和send()與客戶端通信,recv()函數使用參數1024,表示1次最多接收1024字節(jié)數據。由于通信雙方交換bytes字節(jié)流數據,因此,第13行利用str()函數將bytes字節(jié)流數據轉換為字符串。第15行調用函數upper()將字符串中小寫字母轉換為大寫字母。第16行調用函數send()發(fā)送數據之前,利用函數encode()將字符串轉換為bytes字節(jié)流后進行發(fā)送。第17行判斷接收到的來自客戶端的字符串是否為結束標志“.”,若收到結束標志則利用break語句退出循環(huán)。第19行調用函數close()斷開連接,第20行調用函數close()釋放對象s。

在客戶端創(chuàng)建Python程序文件,socket_c.py,代碼如下。

1 #!/usr/bin/env python3

2 # coding: utf-8

3 import socket

4 s = socket.socket(socket.AF_INET, socket. SOCK_STREAM)

5 s.connect(('192.168.3.13',8088))

6 print('I am connecting the server!')

7 for xx in ['aBch','f服務d','h7Tq','.']:

8? ? s.send(xx.encode('utf-8'))

9? ? str1=s.recv(1024)

10? ?str2=str(str1,encoding='utf-8')

11? ?print('The original string is:',xx,'\tthe processed string is:',str2)

12 s.close()

程序第3行引入socket模塊。第4行構造socket對象s,family參數和type參數與服務端相同。第5行調用函數connect()連接服務端,服務端的IP地址和端口號用元組表示。第6行打印提示信息。第7行至第11行的循環(huán)向服務器發(fā)送要處理的數據和接收處理完畢的數據。與服務段程序類似,傳輸的數據格式為bytes字節(jié)流,因此,在數據發(fā)送前和接收數據后,需要對數據格式進行轉換。第12行調用函數close()斷開與服務段的連接。

在服務端運行程序socket_s.py,在客戶端運行程序socket_c.py,服務端和客戶端主機將通過套接字進行通信,服務端程序運行結果如圖1所示,客戶端程序運行結果如圖2所示。

Wait for connecting...

conn=

addr= ('192.168.3.37', 45542)

I received a string is:? aBch

I received a string is:? f服務d

I received a string is:? h7Tq

I received a string is:? .

I am connecting the server!

The original string is: aBch the processed string is: ABCH

The original string is: f服務d the processed string is: F服務D

The original string is: h7Tq the processed string is: H7TQ

The original string is: . the processed string is: .

從圖1和圖2可知,服務端為客戶端提供字符轉換服務,客戶端IP地址為192.168.3.37,端口號為45542。

3? 進程之間通過套接字通信實例

從上述實例可知,主機之間通過套接字通信時使用由IP地址和端口號組成的元組。如果要實現進程之間通過套接字通信,則需要使用套接字文件,并且,通信雙方創(chuàng)建套接字對象時,family參數設置為socket.AF_UNIX。

還是以服務端為客戶端提供字符串轉換服務的程序為例,說明進程之間通過套接字通信的過程。

創(chuàng)建服務端Python程序文件,socket_s_p.py,代碼如下。

1 #!/usr/bin/env python3

2 # coding: utf-8

3 import socket

4 s = socket.socket(socket.AF_UNIX, socket. SOCK_ STREAM)

5 s.bind('a.socket')

6 s.listen(1)

7 print('Wait for connecting...')

8 (conn,addr)=s.accept()

9 print('conn=',conn)

10 print('addr=',addr)

11 while True:

12? ? str1=conn.recv(1024)

13? ? str2=str(str1,encoding='utf-8')

14? ? print('I received a string is: ',str2)

15? ? str3=str2.upper()

16? ? conn.send(str3.encode('utf-8'))

17? ? if str2 =='.' :

18? ? ? ? break

19 conn.close()

20 s.close()

程序第4行創(chuàng)建socket對象函數的family參數設置為socket.AF_UNIX,表示該socket對象將用于進程之間的通信。第5行用文件名a.socket代替由IP地址和端口號組成的元組,表示進程之間將通過套接字文件a.socket進行通信。

創(chuàng)建客戶端Python程序文件,socket_c_p.py,代碼如下。

1 #!/usr/bin/env python3

2 # coding: utf-8

3 import socket

4 s = socket.socket(socket.AF_UNIX, socket. SOCK_STREAM)

5 s.connect('a.socket')

6 print('I am connecting the server!')

7 for xx in ['aBch','f服務d','h7Tq','.']:

8? ? s.send(xx.encode('utf-8'))

9? ? str1=s.recv(1024)

10? ?str2=str(str1,encoding='utf-8')

11? ?print('The original string is:',xx,'\tthe processed string is:',str2)

12 s.close()

與服務端程序類似,程序第4行創(chuàng)建socket對象函數的family參數設置為socket.AF_UNIX,表示該socket對象將用于進程之間的通信。第5行用文件名a.socket代替由IP地址和端口號組成的元組,表示進程之間將通過套接字文件a.socket進行通信。

在不同窗口分別運行服務端程序socket_s_p.py和客戶端程序socket_c_p.py,將分別創(chuàng)建服務端進程和客戶端進程,這兩個進程之間將通過套接字進行通信,服務端進程運行結果如圖3所示,客戶端進程運行結果如圖4所示。

Wait for connecting...

conn=

addr=

I received a string is:? aBch

I received a string is:? f服務d

I received a string is:? h7Tq

I received a string is:? .

I am connecting the server!

The original string is: aBch the processed string is: ABCH

The original string is: f服務d the processed string is: F服務D

The original string is: h7Tq the processed string is: H7TQ

The original string is: . the processed string is: .

對比圖1和圖3,圖2和圖4可知,圖1和圖3稍有差異,差異在于圖3中用a.socket代替了圖1中由服務端的IP地址和端口號組成的元組;圖3中無raddr且addr值為空。圖2和圖4完全一樣。說明進程之間仿照主機之間利用套接字進行通信,用套接字文件代替主機之間通信時所用的元組。

運行文件socket_s_p.py,將在當前目錄下創(chuàng)建套接字文件a.socket,與命令管道文件類似,套接字文件的大小也為0,也遵循Linux系統(tǒng)對文件的權限規(guī)定。

再次運行文件socket_s_p.py,將給出錯誤提示“OSError: [Errno 98] Address already in use”,表示進程之間利用套接字通信時,每次都需要創(chuàng)建新的套接字文件,且不覆蓋已經存在的同名套接字文件。只有先刪除套接字文件a.socket,socket_s_p.py文件才可再次運行。

4? 結束語

套接字文件是Linux系統(tǒng)的七種文件之一,也是進程之間通信的一種手段,在Linux系統(tǒng)中具有重要作用。本文通過對比主機之間和進程之間通過套接字通信的不同,說明Linux系統(tǒng)中套接字文件的作用,幫助學生深入理解套接字文件。

參考文獻

[1]鳥哥. 鳥哥的Linux私房菜基礎學習篇(第四版)[M]. 北京: 人民郵電出版社, 2018, 10.

[2]Machtelt Garrels. Introduction to Linux[EB/OL]. (2010-05- 12) [2019-09-27]. http://tille.garrels.be/training/tldp/.

[3]燕彩蓉, 朱黎華, 劉瑜琪, 等. 新工科背景下Linux系統(tǒng)課程教學研究[J]. 計算機教育, 2019(6): 152-156.

[4]吳淑泉. 高校“Linux操作系統(tǒng)”課程教學研究與探索[J]. 教育理論與實踐, 2017, 37(33): 57-58.

[5]趙宏, 朱忠政, 常兆斌. Linux系統(tǒng)教學中關于命名管道文件的解析[J]. 軟件, 2020, 41(02): 108-110.

[6]趙宏, 包廣斌, 馬棟林. Python網絡編程(Linux)[M]. 北京: 清華大學出版社, 2018, 10.

主站蜘蛛池模板: 日本欧美一二三区色视频| 亚洲有无码中文网| 国产一区二区影院| 网久久综合| 国产91无码福利在线| 国产sm重味一区二区三区| 欧类av怡春院| 亚洲人成网站在线播放2019| 日本道综合一本久久久88| 激情五月婷婷综合网| 国产噜噜在线视频观看| 亚洲免费人成影院| 日韩美毛片| 欧美视频在线播放观看免费福利资源| 最新国产精品第1页| 在线欧美日韩| 中文字幕自拍偷拍| 国产美女在线观看| 天堂av综合网| 免费观看国产小粉嫩喷水| 国产成人亚洲欧美激情| 国产香蕉一区二区在线网站| 国产精品美女在线| 一级毛片基地| 青青草国产一区二区三区| 国产91小视频在线观看| 亚洲a级在线观看| 国产精品亚洲专区一区| 国产91成人| 伊伊人成亚洲综合人网7777| 夜夜拍夜夜爽| 任我操在线视频| www.91在线播放| 99视频精品在线观看| 国产小视频a在线观看| 色综合久久久久8天国| 国内精自线i品一区202| 欧洲在线免费视频| 极品国产一区二区三区| 久久久久免费精品国产| 精品国产成人a在线观看| 影音先锋亚洲无码| www.狠狠| 四虎精品国产永久在线观看| 尤物午夜福利视频| 美女一级毛片无遮挡内谢| 伊人激情综合| 精品视频一区二区观看| 亚洲香蕉久久| av无码一区二区三区在线| 亚洲a免费| 国产乱人视频免费观看| 亚洲第一成年网| 99久久无色码中文字幕| 国产在线自乱拍播放| 97狠狠操| 99精品视频九九精品| 久久网欧美| 国产美女一级毛片| 香蕉蕉亚亚洲aav综合| 国产熟女一级毛片| 亚洲永久免费网站| 天天综合亚洲| 婷婷激情亚洲| 青青青视频蜜桃一区二区| 国产精品无码影视久久久久久久 | 一本综合久久| 亚洲成年人网| 三上悠亚一区二区| 免费无码又爽又刺激高| 亚洲欧洲日韩综合| 欧美啪啪网| 精品久久人人爽人人玩人人妻| 91丝袜美腿高跟国产极品老师| 五月天丁香婷婷综合久久| 国产无人区一区二区三区| 免费精品一区二区h| 精品视频第一页| 99久久精彩视频| 2021精品国产自在现线看| 国产精品久久久久无码网站| 久久精品中文字幕少妇|