亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        趙宏 朱忠政 孔東一

        摘? 要: 針對(duì)Linux系統(tǒng)相關(guān)內(nèi)容教學(xué)中對(duì)于套接字文件講述不夠詳細(xì),導(dǎo)致學(xué)生對(duì)套接字文件認(rèn)識(shí)模糊的問(wèn)題,基于套接字通信原理,利用實(shí)例對(duì)比主機(jī)之間和進(jìn)程之間利用套接字通信的差異,說(shuō)明Linux系統(tǒng)中套接字文件的作用,幫助學(xué)生對(duì)套接字文件的深入理解。

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

        中圖分類(lèi)號(hào): TP301? ? 文獻(xiàn)標(biāo)識(shí)碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.09.009

        本文著錄格式:趙宏,朱忠政,孔東一. Linux系統(tǒng)教學(xué)中關(guān)于套接字文件的解析[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)作為開(kāi)放源代碼和自由軟件的代表,廣泛應(yīng)用在各行各業(yè),運(yùn)行在各種機(jī)型和硬件平臺(tái)上[1-2]。Linux系統(tǒng)符合POSIX(Portable Operating System Interface)標(biāo)準(zhǔn),功能強(qiáng)大,效率高,配置靈活,安全性高,且具有豐富的工具軟件和應(yīng)用軟件,其相關(guān)內(nèi)容在大多數(shù)高校信息類(lèi)專(zhuān)業(yè)中作為專(zhuān)業(yè)基礎(chǔ)課開(kāi)設(shè)[3-4],例如《Linux操作系統(tǒng)》、《Linux系統(tǒng)內(nèi)核分析》、《Linux系統(tǒng)程序設(shè)計(jì)》等。

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

        文獻(xiàn)[5]詳細(xì)介紹了命名管道文件的功能和實(shí)際應(yīng)用實(shí)例,本文首先介紹主機(jī)間通過(guò)套接字通信的機(jī)制和實(shí)例,然后討論進(jìn)程間通過(guò)套接字通信的方式,并通過(guò)實(shí)例進(jìn)行詳細(xì)說(shuō)明,加深學(xué)生對(duì)套接字文件的認(rèn)識(shí)。

        1? 套接字介紹

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

        主機(jī)之間通過(guò)套接字進(jìn)行通信時(shí),無(wú)論是服務(wù)端還是客戶(hù)端,都需要?jiǎng)?chuàng)建socket對(duì)象,并設(shè)置family參數(shù)和type參數(shù)。利用Python語(yǔ)言創(chuàng)建socket對(duì)象的語(yǔ)句格式如下。

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

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

        2? 主機(jī)之間通過(guò)套接字通信實(shí)例

        本實(shí)例中,服務(wù)端將來(lái)自客戶(hù)端的字符串中的字母轉(zhuǎn)換為大寫(xiě)的服務(wù)。

        假設(shè)服務(wù)端IP地址為192.168.3.13,在服務(wù)端創(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()

        代碼前的行號(hào)是為敘述方便而加,以#開(kāi)頭的代碼為注釋?zhuān)粚?shí)際執(zhí)行。

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

        在客戶(hù)端創(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服務(wù)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行構(gòu)造socket對(duì)象s,family參數(shù)和type參數(shù)與服務(wù)端相同。第5行調(diào)用函數(shù)connect()連接服務(wù)端,服務(wù)端的IP地址和端口號(hào)用元組表示。第6行打印提示信息。第7行至第11行的循環(huán)向服務(wù)器發(fā)送要處理的數(shù)據(jù)和接收處理完畢的數(shù)據(jù)。與服務(wù)段程序類(lèi)似,傳輸?shù)臄?shù)據(jù)格式為bytes字節(jié)流,因此,在數(shù)據(jù)發(fā)送前和接收數(shù)據(jù)后,需要對(duì)數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換。第12行調(diào)用函數(shù)close()斷開(kāi)與服務(wù)段的連接。

        在服務(wù)端運(yùn)行程序socket_s.py,在客戶(hù)端運(yùn)行程序socket_c.py,服務(wù)端和客戶(hù)端主機(jī)將通過(guò)套接字進(jìn)行通信,服務(wù)端程序運(yùn)行結(jié)果如圖1所示,客戶(hù)端程序運(yùn)行結(jié)果如圖2所示。

        Wait for connecting...

        conn=

        addr= ('192.168.3.37', 45542)

        I received a string is:? aBch

        I received a string is:? f服務(wù)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服務(wù)d the processed string is: F服務(wù)D

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

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

        從圖1和圖2可知,服務(wù)端為客戶(hù)端提供字符轉(zhuǎn)換服務(wù),客戶(hù)端IP地址為192.168.3.37,端口號(hào)為45542。

        3? 進(jìn)程之間通過(guò)套接字通信實(shí)例

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

        還是以服務(wù)端為客戶(hù)端提供字符串轉(zhuǎn)換服務(wù)的程序?yàn)槔?,說(shuō)明進(jìn)程之間通過(guò)套接字通信的過(guò)程。

        創(chuàng)建服務(wù)端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對(duì)象函數(shù)的family參數(shù)設(shè)置為socket.AF_UNIX,表示該socket對(duì)象將用于進(jìn)程之間的通信。第5行用文件名a.socket代替由IP地址和端口號(hào)組成的元組,表示進(jìn)程之間將通過(guò)套接字文件a.socket進(jìn)行通信。

        創(chuàng)建客戶(hù)端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服務(wù)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()

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

        在不同窗口分別運(yùn)行服務(wù)端程序socket_s_p.py和客戶(hù)端程序socket_c_p.py,將分別創(chuàng)建服務(wù)端進(jìn)程和客戶(hù)端進(jìn)程,這兩個(gè)進(jìn)程之間將通過(guò)套接字進(jìn)行通信,服務(wù)端進(jìn)程運(yùn)行結(jié)果如圖3所示,客戶(hù)端進(jìn)程運(yùn)行結(jié)果如圖4所示。

        Wait for connecting...

        conn=

        addr=

        I received a string is:? aBch

        I received a string is:? f服務(wù)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服務(wù)d the processed string is: F服務(wù)D

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

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

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

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

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

        4? 結(jié)束語(yǔ)

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

        參考文獻(xiàn)

        [1]鳥(niǎo)哥. 鳥(niǎo)哥的Linux私房菜基礎(chǔ)學(xué)習(xí)篇(第四版)[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)課程教學(xué)研究[J]. 計(jì)算機(jī)教育, 2019(6): 152-156.

        [4]吳淑泉. 高?!癓inux操作系統(tǒng)”課程教學(xué)研究與探索[J]. 教育理論與實(shí)踐, 2017, 37(33): 57-58.

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

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

        国产欧美va欧美va香蕉在线观| 国产成人无码一区二区三区| 亚洲av无码av在线播放| 国产70老熟女重口小伙子| 久久精品亚洲精品毛片| 国产偷闻女邻居av在线观看| 极品少妇xxxx精品少妇偷拍| 国产做a爱片久久毛片a片 | 欧美老肥婆牲交videos| 国产午夜精品久久久久免费视| 一区二区视频观看在线| 亚洲永久精品日韩成人av| 日韩大片高清播放器大全| 丰满熟妇乱又伦| 亚洲一区二区三区av在线免费| 国产精品国产三级农村妇女| 人人妻人人澡人人爽人人dvd| 亚洲国产长腿丝袜av天堂| 国产自产c区| 亚洲第一大av在线综合| 国产亚洲综合一区二区三区| 久久久久久久久888| 国产精品国产自线拍免费| 久久国产精品美女厕所尿尿av| 大学生高潮无套内谢视频| 国产成人精品三级麻豆| 国产在线一区二区视频免费观看| 一区二区三区午夜视频在线| 精品少妇一区二区三区免费观| 婷婷丁香91| 女女同性av一区二区三区| 五月色丁香婷婷网蜜臀av| 亚洲国产成人精品无码区99| 天堂AV无码AV毛片毛| 人妻中文久久人妻蜜桃| 和黑人邻居中文字幕在线| 欧美精品在线一区| 久久亚洲av午夜福利精品西区| 亚洲国产婷婷香蕉久久久久久| 精品无码中文视频在线观看| 国产成人丝袜在线无码|