电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python實現socket庫網絡通信套接字

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

Socket 套接字:通訊端點 簡介

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

Socket 是任何一種計算機網絡通訊中最基礎的內容。Socket通訊一般用戶C/S結構系統的網絡通訊。

Socket 網絡通訊是基于TCP(傳輸控制協議)或UDP(用戶數據報協議)兩種協議通訊,所以有 面向連接(TCP )與無連接(UDP ) 兩種通訊方式。

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

Socket網絡通信套接字

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

什么是套接字?

套接字是程序在本地或者通過互聯網來回傳遞數據時所用通信通道的一個端點。

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

地址簇

Python支持3個地址簇:

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

套接字類型有兩種:

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

大多數應用協議(如HTTP)都建立在TCP基礎上,因為這樣更容易創建自動處理消息排序和傳送的復雜應用。

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

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

socket庫包含一些與網絡上的域名服務交互的函數,比如解析域名為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實現socket庫網絡通信套接字

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

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

getservbyname()與getservbyport()

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

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實現socket庫網絡通信套接字

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

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

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

運行之后,效果如下:

Python實現socket庫網絡通信套接字

getprotobyname()

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

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實現socket庫網絡通信套接字

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

getaddrinfo(查找服務器地址)

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

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('協議碼: ', ipproto_str[ipproto]) print('主機規范名: ', canonname) print('ip地址與端口號:', sockaddr)

運行之后,效果如下:

Python實現socket庫網絡通信套接字

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

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

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

IP地址的表示方式

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

如果想在Python和C之間轉換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實現socket庫網絡通信套接字

inet_pton()與inet_ntop()

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

這2個函數既能處理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實現socket庫網絡通信套接字

以上就是Python實現socket庫網絡通信套接字的詳細內容,更多關于Python socket庫的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 赛尔特智能移动阳光房-阳光房厂家-赛尔特建筑科技(广东)有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 执业药师报名时间,报考条件,考试时间-首页入口 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 南京交通事故律师-专打交通事故的南京律师 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 北京乾茂兴业科技发展有限公司 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 |