GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing python.github.io — مقدمهای بر ماژول ipaddress مقدمهای بر ماژول ipaddress¶ایجاد اشیاء نشانی/شبکه/رابط¶از آنجا که یادداشتی درباره نسخههای IP¶برای خوانندگانی که بهویژه با آدرسدهی IP آشنا نیستند، مهم است بدانند که پروتکل اینترنت (IP) در حال حاضر در حال گذار از نسخه 4 این پروتکل به نسخه 6 است. این گذار عمدتاً به این دلیل رخ میدهد که نسخه 4 پروتکل، آدرسهای کافی برای پاسخگویی به نیازهای کل جهان را فراهم نمیکند، بهویژه با توجه به افزایش تعداد دستگاههایی که اتصال مستقیم به اینترنت دارند. توضیح جزئیات تفاوتهای میان دو نسخه از پروتکل خارج از دامنه این مقدمه است، اما شما باید دستکم از وجود این دو نسخه آگاه باشید، و گاهی لازم است استفاده از یکی از این دو نسخه را تحمیل کنید. آدرسهای میزبان IP¶نشانیها، که اغلب با عنوان «نشانیهای میزبان» شناخته میشوند، پایهایترین واحد هنگام کار با نشانیدهی IP هستند. سادهترین راه برای ایجاد نشانیها، استفاده از تابع کارخانهایٔ >>> ipaddress.ip_address('192.0.2.1') IPv4Address('192.0.2.1') >>> ipaddress.ip_address('2001:DB8::1') IPv6Address('2001:db8::1') نشانیها همچنین میتوانند مستقیماً از اعداد صحیح ساخته شوند. مقادیری که در ۳۲ بیت جای میگیرند، نشانیهای IPv4 فرض میشوند: >>> ipaddress.ip_address(3221225985) IPv4Address('192.0.2.1') >>> ipaddress.ip_address(42540766411282592856903984951653826561) IPv6Address('2001:db8::1') برای وادار کردن به استفاده از نشانیهای IPv4 یا IPv6، میتوان کلاسهای مربوطه را مستقیماً فراخوانی کرد. این کار بهویژه برای وادار کردن به ایجاد نشانیهای IPv6 برای اعداد صحیح کوچک مفید است: >>> ipaddress.ip_address(1) IPv4Address('0.0.0.1') >>> ipaddress.IPv4Address(1) IPv4Address('0.0.0.1') >>> ipaddress.IPv6Address(1) IPv6Address('::1') تعریف شبکهها¶نشانیهای میزبان معمولاً با یکدیگر در شبکههای IP گروهبندی میشوند، بنابراین در مورد آدرسها، یک تابع کارخانهای ارائه شده است که نسخه صحیح IP را بهطور خودکار تعیین میکند: >>> ipaddress.ip_network('192.0.2.0/24') IPv4Network('192.0.2.0/24') >>> ipaddress.ip_network('2001:db8::0/96') IPv6Network('2001:db8::/96') اشیاء شبکه نمیتوانند هیچ بیت میزبان تنظیمشدهای داشته باشند. اثر عملی این موضوع آن است که بهطور پیشفرض، تلاش برای ایجاد یک شیء شبکه با بیتهای میزبانِ تنظیمشده، باعث پرتاب >>> ipaddress.ip_network('192.0.2.1/24') Traceback (most recent call last): ... ValueError: 192.0.2.1/24 has host bits set >>> ipaddress.ip_network('192.0.2.1/24', strict=False) IPv4Network('192.0.2.0/24') اگرچه شکل رشتهای انعطافپذیری بسیار بیشتری فراهم میکند، شبکهها را میتوان درست مانند آدرسهای میزبان، با اعداد صحیح نیز تعریف کرد. در این حالت، شبکه تنها شامل آدرس شناساییشده توسط آن عدد صحیح در نظر گرفته میشود، بنابراین پیشوند شبکه، کل آدرس شبکه را شامل میشود: >>> ipaddress.ip_network(3221225984) IPv4Network('192.0.2.0/32') >>> ipaddress.ip_network(42540766411282592856903984951653826560) IPv6Network('2001:db8::/128') همانند آدرسها، میتوان با فراخوانی مستقیم سازندهی کلاس بهجای استفاده از تابع کارخانه (factory function)، ایجاد یک نوع خاص از شبکه را اجباری کرد. رابطهای میزبان¶همانطور که درست در بالا اشاره شد، اگر نیاز دارید نشانیای در یک شبکه خاص را توصیف کنید، نه کلاسهای نشانی و نه کلاسهای شبکه کافی نیستند. مهندسان شبکه و افرادی که ابزارهایی برای فایروالها و مسیریابها مینویسند، معمولاً از نمادگذاری مانند >>> ipaddress.ip_interface('192.0.2.1/24') IPv4Interface('192.0.2.1/24') >>> ipaddress.ip_interface('2001:db8::1/96') IPv6Interface('2001:db8::1/96') ورودیهای عدد صحیح پذیرفته میشوند (همانطور که در شبکهها نیز چنین است)، و میتوان با فراخوانی مستقیم سازنده مربوطه، استفاده از نسخه خاصی از IP را الزامی کرد. بررسی اشیاء آدرس/شبکه/رابط¶شما زحمت ایجاد یک شیء IPv(4|6)(Address|Network|Interface) را به خود دادهاید، بنابراین احتمالاً میخواهید اطلاعاتی دربارهی آن کسب کنید. استخراج نسخه IP: >>> addr4 = ipaddress.ip_address('192.0.2.1') >>> addr6 = ipaddress.ip_address('2001:db8::1') >>> addr6.version 6 >>> addr4.version 4 به دست آوردن شبکه از یک رابط: >>> host4 = ipaddress.ip_interface('192.0.2.1/24') >>> host4.network IPv4Network('192.0.2.0/24') >>> host6 = ipaddress.ip_interface('2001:db8::1/96') >>> host6.network IPv6Network('2001:db8::/96') یافتن تعداد آدرسهای منفرد موجود در یک شبکه: >>> net4 = ipaddress.ip_network('192.0.2.0/24') >>> net4.num_addresses 256 >>> net6 = ipaddress.ip_network('2001:db8::0/96') >>> net6.num_addresses 4294967296 پیمایش آدرسهای «قابلاستفاده» در یک شبکه: >>> net4 = ipaddress.ip_network('192.0.2.0/24') >>> for x in net4.hosts(): ... print(x) 192.0.2.1 192.0.2.2 192.0.2.3 192.0.2.4 ... 192.0.2.252 192.0.2.253 192.0.2.254 بهدست آوردن netmask (یعنی بیتهای تنظیمشده متناظر با پیشوند شبکه) یا hostmask (هر بیتی که بخشی از netmask نیست): >>> net4 = ipaddress.ip_network('192.0.2.0/24') >>> net4.netmask IPv4Address('255.255.255.0') >>> net4.hostmask IPv4Address('0.0.0.255') >>> net6 = ipaddress.ip_network('2001:db8::0/96') >>> net6.netmask IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::') >>> net6.hostmask IPv6Address('::ffff:ffff') بسط یا فشردهسازی نشانی: >>> addr6.exploded '2001:0db8:0000:0000:0000:0000:0000:0001' >>> addr6.compressed '2001:db8::1' >>> net6.exploded '2001:0db8:0000:0000:0000:0000:0000:0000/96' >>> net6.compressed '2001:db8::/96' اگرچه IPv4 از بسط (explosion) یا فشردهسازی پشتیبانی نمیکند، اشیاء مرتبط همچنان ویژگیهای مربوطه را فراهم میکنند تا کد مستقل از نسخه بتواند بهراحتی اطمینان حاصل کند که مختصرترین یا پرجزئیاتترین فرم برای آدرسهای IPv6 استفاده میشود و در عین حال آدرسهای IPv4 بهدرستی مدیریت میشوند. شبکهها بهعنوان فهرستهایی از نشانیها¶گاهی مفید است که با شبکهها مانند فهرستها رفتار کنید. این بدان معناست که میتوانید آنها را به این شکل اندیسگذاری کنید: >>> net4[1] IPv4Address('192.0.2.1') >>> net4[-1] IPv4Address('192.0.2.255') >>> net6[1] IPv6Address('2001:db8::1') >>> net6[-1] IPv6Address('2001:db8::ffff:ffff') این همچنین به این معناست که اشیاء شبکهای را میتوان با سینتکس آزمون عضویت در فهرست به این صورت استفاده کرد: if address in network: # do something آزمون دربرگیری (containment testing) بهصورت کارآمد بر اساس پیشوند شبکه انجام میشود: >>> addr4 = ipaddress.ip_address('192.0.2.1') >>> addr4 in ipaddress.ip_network('192.0.2.0/24') True >>> addr4 in ipaddress.ip_network('192.0.3.0/24') False مقایسهها¶
>>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2') True اگر سعی کنید اشیایی با نسخهها یا انواع مختلف را مقایسه کنید، استثنای استفاده از آدرسهای IP با سایر ماژولها¶ماژولهای دیگری که از آدرسهای IP استفاده میکنند (مانند >>> addr4 = ipaddress.ip_address('192.0.2.1') >>> str(addr4) '192.0.2.1' >>> int(addr4) 3221225985 دریافت جزئیات بیشتر در صورت شکست در ایجاد نمونه¶هنگام ایجاد اشیای نشانی/شبکه/رابط با استفاده از توابع کارخانهای مستقل از نسخه، هر خطایی بهصورت برای پشتیبانی از موارد استفادهای که دسترسی به این جزئیات اضافی در آنها مفید است، سازندههای هر کلاس در واقع استثناهای زیرکلاس پیامهای خطا هنگامی که مستقیماً از سازندههای کلاس استفاده میکنید، بهطور قابلتوجهی جزئیتر هستند. برای مثال: >>> ipaddress.ip_address("192.168.0.256") Traceback (most recent call last): ... ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address >>> ipaddress.IPv4Address("192.168.0.256") Traceback (most recent call last): ... ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256' >>> ipaddress.ip_network("192.168.0.1/64") Traceback (most recent call last): ... ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network >>> ipaddress.IPv4Network("192.168.0.1/64") Traceback (most recent call last): ... ipaddress.NetmaskValueError: '64' is not a valid netmask با این حال، کلاس والد هر دو استثنای مختص ماژول، try: network = ipaddress.IPv4Network(address) except ValueError: print('address/netmask is invalid for IPv4:', address)
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |