av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

瀏覽:5日期:2022-06-17 14:40:42
目錄Socket網(wǎng)絡(luò)通信套接字什么是套接字?地址簇套接字類型套接字的簡單應(yīng)用gethostbyname_ex()與gethostbyname()getservbyname()與getservbyport()getprotobyname()getaddrinfo(查找服務(wù)器地址)IP地址的表示方式inet_pton()與inet_ntop()

Socket 套接字:通訊端點 簡介

socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,對于文件用【打開】【讀寫】【關(guān)閉】模式來操作。socket就是該模式的一個實現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO、打開、關(guān)閉)。

Socket 是任何一種計算機網(wǎng)絡(luò)通訊中最基礎(chǔ)的內(nèi)容。Socket通訊一般用戶C/S結(jié)構(gòu)系統(tǒng)的網(wǎng)絡(luò)通訊。

Socket 網(wǎng)絡(luò)通訊是基于TCP(傳輸控制協(xié)議)或UDP(用戶數(shù)據(jù)報協(xié)議)兩種協(xié)議通訊,所以有 面向連接(TCP )與無連接(UDP ) 兩種通訊方式。

Python 要創(chuàng)建TCP 套接字就得在創(chuàng)建的時候,指定套接字類型為SOCK_STREAM,它使用 TCP/IP通訊協(xié)議。

Socket網(wǎng)絡(luò)通信套接字

socket庫提供了一個底層C API,可以使用BSD套接字接口實現(xiàn)網(wǎng)絡(luò)通信。它包括socket類,用于處理具體的數(shù)據(jù)通道,還包括用來完成網(wǎng)絡(luò)相關(guān)任務(wù)的函數(shù),如將一個服務(wù)器名轉(zhuǎn)換為一個地址以及格式化數(shù)據(jù)以便在網(wǎng)絡(luò)上發(fā)送。

什么是套接字?

套接字是程序在本地或者通過互聯(lián)網(wǎng)來回傳遞數(shù)據(jù)時所用通信通道的一個端點。

套接字有2個主要屬性用于控制如何發(fā)送數(shù)據(jù):地址簇(address family)控制所用的OSI網(wǎng)絡(luò)層協(xié)議;套接字類型(socket type)控制傳輸層協(xié)議。(參考《計算機網(wǎng)絡(luò)》7層協(xié)議)

地址簇

Python支持3個地址簇:

AF_INET:用于IPv4尋址。IPv4長度為4個字節(jié),通常表示為4個數(shù)的序列,每個字節(jié)對應(yīng)一個數(shù),用點號分割(如121.63.0.243)。這些值通常被稱為IP地址。目前IPv4依舊還是主流。 AF_INET6:用于IPv6尋址。目前IPv6已經(jīng)小范圍應(yīng)用,它支持128位地址和通信流調(diào)整,還支持IPv4不支持的一些路由特性。 AF_UNIX:用于UNIX域套接字(UDS)的地址簇,這是一種POSIX兼容系統(tǒng)上的進程間通信協(xié)議。UDS的實現(xiàn)通常允許操作系統(tǒng)直接從進程向進程間傳遞數(shù)據(jù),而不用通過網(wǎng)絡(luò)棧。這比使用AF_INET更高效,但是由于要用到文件系統(tǒng)作為尋址的命令空間,所以UDS僅限于同一個系統(tǒng)上的進程。套接字類型

套接字類型有兩種:

SOCK_DGRAM:面向消息的數(shù)據(jù)報傳輸,數(shù)據(jù)報套接字通常與UDP關(guān)聯(lián),即用戶數(shù)據(jù)報協(xié)議。這些套接字能提供不可靠的消息傳送。 SOCK_STREAM:面向流的傳輸,與TCP相關(guān),即傳輸控制協(xié)議。它們可以在客戶和服務(wù)器之間提供字節(jié)流,通過超時管理,重傳和其他特性確保提供消息傳送或失敗通知。

大多數(shù)應(yīng)用協(xié)議(如HTTP)都建立在TCP基礎(chǔ)上,因為這樣更容易創(chuàng)建自動處理消息排序和傳送的復(fù)雜應(yīng)用。

UDP通常用于順序不太重要的協(xié)議(如DNS交換)。UDP與TCP都支持IPv4與IPv6。

套接字的簡單應(yīng)用gethostbyname_ex()與gethostbyname()

socket庫包含一些與網(wǎng)絡(luò)上的域名服務(wù)交互的函數(shù),比如解析域名為IP地址可以用到gethostbyname_ex(),示例如下:

import sockethost_str = [ ’www.baidu.com’, ’cloud.tencent.com’, ’www.csdn.net’]for host in host_str: try:name, aliases, addresses = socket.gethostbyname_ex(host)print(host)print('主機名:', name)print('所有別名:', aliases)print('所有可用IP地址:', addresses) except socket.error as msg:print(host, msg)

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

gethostbyname_ex:該函數(shù)返回3個參數(shù),主機名,別名,以及解析能跳轉(zhuǎn)到當前主機的IP地址。

gethostbyname:類似的函數(shù),只返回當前主機的IP地址。

getservbyname()與getservbyport()

socket庫提供getservbyname()函數(shù)用于查找網(wǎng)絡(luò)服務(wù)的端口號和標準名,示例如下所示:

import socketfrom urllib.parse import urlparseurl_str = [ ’https://www.baidu.com’, ’https://www.csdn.net’, ’smtp://smtp.qq.com’,]for url in url_str: try:parsed_url = urlparse(url)port = socket.getservbyname(parsed_url.scheme)print(url)print('端口號:', port) except socket.error as msg:print(url, msg)

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

當然,其實最有用的并不是給定一個鏈接去查詢端口號,而是逆向操作。(因為標準化服務(wù)端口號一般都是固定的)

socket庫提供getservbyport()函數(shù)用于完成逆向的服務(wù)端口查找,示例代碼如下所示:

import socketurl = ’{}://smtp.qq.com’.format(socket.getservbyport(25))print(url)

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

getprotobyname()

socket庫還可以使用getprotobyname()函數(shù)獲取分配給一個傳輸協(xié)議的端口號,示例如下:

import socket#獲取匹配開頭字符串的所有屬性值def getConstants(prefix): return {getattr(socket, n): nfor n in dir(socket)if n.startswith(prefix) }ipproto_str = getConstants('IPPROTO_')for agree in [’tcp’, ’udp’]: num = socket.getprotobyname(agree) name = ipproto_str[num] print(name, num)

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

對于協(xié)議碼,在程序定義中一般都是標準化常量,這就是意味著,它們的常量名都有一定的規(guī)律,而socket協(xié)議碼前綴是IPPROTO_。

getaddrinfo(查找服務(wù)器地址)

getaddrinfo()函數(shù)用于將一個服務(wù)的基本地址轉(zhuǎn)換為一個元組列表,其中包含建立一個連接所需要的全部信息。比如其網(wǎng)絡(luò)簇與協(xié)議等,示例如下:

import socket# 獲取匹配開頭字符串的所有屬性值def getConstants(prefix): return {getattr(socket, n): nfor n in dir(socket)if n.startswith(prefix) }ipproto_str = getConstants('IPPROTO_')family_str = getConstants('AF_')type_str = getConstants('SOCK_')for response in socket.getaddrinfo(’www.csdn.net’, ’http’, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_TCP, flags=socket.AI_CANONNAME): family, socktype, ipproto, canonname, sockaddr = response print('地址簇: ', family_str[family]) print('套接字類型: ', type_str[socktype]) print('協(xié)議碼: ', ipproto_str[ipproto]) print('主機規(guī)范名: ', canonname) print('ip地址與端口號:', sockaddr)

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

這里如果只用socket.getaddrinfo(‘www.csdn.net’, ‘http’),表示不需要過濾任何連接信息,但大型的網(wǎng)站一般都有幾個IP或者域名跳轉(zhuǎn)到主頁的。

所以通過后面的參數(shù),可以篩選自己需要的鏈接信息。

其中,最后一個參數(shù)socket.AI_CANONNAME表示如果主機有別名,那么結(jié)果中會包含服務(wù)器的標準名。所有沒有這個標志,標準名為空。

IP地址的表示方式

如果讀者有C的經(jīng)驗,那么肯定知道,通過C語言編寫的套接字程序是使用struct sockaddr結(jié)構(gòu)體,它將IP地址表示為二進制,而不是上面顯示的Python字符串形式。

如果想在Python和C之間轉(zhuǎn)換IPv4地址,可以使用inet_aton()和inet_ntoa()。示例如下:

import socketimport binasciiip_list = [ '192.168.50.1', '127.0.0.1']for ip in ip_list: packed = socket.inet_aton(ip) print('原始字符串ip地址:', ip) print('C庫能識別的ip地址', binascii.hexlify(packed)) print('還原C庫ip地址字符串', socket.inet_ntoa(packed)) print()

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

inet_pton()與inet_ntop()

相信讀者如果在測試上面代碼,那么輸入上面inet_aton()函數(shù)時,一定看到提醒中還有inet_pton()與inet_ntop()函數(shù)。

這2個函數(shù)既能處理IPv4也能處理IPv6,而inet_aton()和inet_ntoa()只能處理IPv4。它們的使用方式如下:

import socketimport binasciiipv6_str = '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'packed = socket.inet_pton(socket.AF_INET6, ipv6_str)print('原始字符串ip地址:', ipv6_str)print('C庫能識別的ip地址', binascii.hexlify(packed))print('還原C庫ip地址字符串', socket.inet_ntop(socket.AF_INET6, packed))print()ipv4_str = '192.168.50.1'packed = socket.inet_pton(socket.AF_INET, ipv4_str)print('原始字符串ip地址:', ipv4_str)print('C庫能識別的ip地址', binascii.hexlify(packed))print('還原C庫ip地址字符串', socket.inet_ntop(socket.AF_INET, packed))print()

運行之后,效果如下:

Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

以上就是Python實現(xiàn)socket庫網(wǎng)絡(luò)通信套接字的詳細內(nèi)容,更多關(guān)于Python socket庫的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产精品视频在线观看 | 亚洲自拍偷拍免费视频 | 成人av一区| 久久国产区 | 国产精品久久久久久久一区二区 | 欧美9999 | 日本午夜免费福利视频 | 国产精品美女久久久久久免费 | 亚洲一区二区三区在线 | 久草.com| 久久中文网 | 久久一区二区视频 | 国产精品久久久久久久久久久久久 | 91高清视频在线观看 | 国产精品一级 | 日韩国产中文字幕 | www国产精品 | 国产人成精品一区二区三 | 国产成人免费视频 | 午夜资源 | 91精品一区二区三区久久久久久 | 久久精品a| 精品国产一区二区三区久久久蜜月 | 福利av在线| 国产精品久久 | av影音资源 | 色射综合| 欧美性极品xxxx做受 | 成人免费视频在线观看 | 男女国产网站 | 久久国产婷婷国产香蕉 | 国产精品久久久久久吹潮 | 中文字幕精品一区久久久久 | 久久精品免费观看 | 美国黄色一级片 | 伊人狠狠操 | 精品国产99 | 91干b| 黄色大片免费播放 | 亚洲三区在线播放 | 一级片在线观看 |