recent
أخبار ساخنة

إنشاء سكربتات اتصال بين العميل والسيرفر بواسطة مكتبة socket الدرس |19|

الصفحة الرئيسية
socket python library

مكتبة socket في بايثون 2

درس اليوم هو تكملة للدرس السابق في مكتبة socket بقي منه اجزاء اخيرة قبل الدخول إلى قسم السكيورتي security الخاصة بـ socket.
ليكن لدينا عنوان ايبي طبيعي و نريد تحويله إلى صيغة network, مثلاً اذا اتينا لعمل صورة للداتا في النيت وورك لا نراها بالصيغة الذي نراها طبيعيه, بل نراها بصيغة البايتس و يلزم ان نرجعها لصيغة الادرس لكي نرى الادرس بشكل طبيعي توجد methods تمكننا من هذا.

>>> import socket
>>> ip = "192.168.1.1"  #ايبي طبيعي
>>> ip
'192.168.1.1'
>>> socket.inet_aton(ip)  #تحويل لصيغة تفهمها الشبكة
b' \xc0 \xa8\ x01\ x01'
>>> socket.inet_ntoa(b' \xc0\ xa8\ x01\ x01')  #عملية عكسية للسابقة
'192.168.1.1'

معنى aton
  • a = ip address.
  • to = to إلى
  • n = network.

هذا يفيدنا كثيراً في مجال sniffing.

 

حجم الإستقبال و الإرسال buffer size

يعني أن هذا يستخدم لمعرفة حجم الإستقبال والإرسال لدينا
>>> import socket
>>> sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> d_s = sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
>>> d_s
16384
>>> d_r = d_s = sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
>>> d_r
131072

في البداية أنشأنا جلسة بإسم socket و عيننا لها القيم socket.socket و AF ذكرناها في الدرس السابق والذي تعني ipv4.

و d_s يعني default, وعن طريق هذه الميثود getsockopt نعرف اللفل الذي لدينا, اللفل هو socket.SOL_SOCKET هو من لفلات الشبكة, وبعدها وضعنا socket.SO_SNDBUF يعني اعطينا ماهو default send buffer, وبالسطر الذي يليه كتبنا d_s و أعطانا الديفولت وهو 16384.

وبعدها وضعنا d_r يعني الأستقبال, و طلبنا أن يعطينا الأستقبال SO_RCVBUF و اعطانا اياه عند كتابة d_r.
ولتغيير هذه القيم السابقة نستخدم كالتالي

>>>sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,1024)
b' \x00@ \x00 \x00'

لا يحتاج إلى شرح فقط اضفنا له القيمة الجديدة في النهاية 1024 و رجع لنا الرقم بشكل تفهمه الشبكة.

simple server & client server

لكي نعمل simple server و simple client يجب علينا ان نعمل اولاً بعض الخطوات المهمة لعمل سرفر وهي :
bind   #معلومات الاتصال يعني السرفر و البورت
listen  #تعني التنصت مع السرفر
accept  #القبول من السرفر
send  #الأرسال
recv  #الأستقبال

مثلا نريد عمل port scanner يجب أن نكون على دراية أنه توجد ميثود بسيطة لعمل هذا, مثال
>>> import socket
>>> sock = socket.socket (socket.AF_INET,socket.SOCK_STREAM)
>>> sock.connect_ex(("127.0.0.1",80))
0
>>> sock.connect_ex(("127.0.0.1",21))
10056

الأول هو 0 يعني البورت مفتوح و الثانية 10056 يعني مقفول, أي قيمه غير 0 يعني مقفول.
 

إنشاء سيرفر server بسيط عبر مكتبة socket

import socket
#my server
try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(("127.0.0.1",5555))
    s.listen(5)
    client , addr = s.accept()
    print("connection from {0}".format(addr))
except socket.error as e:
    print(e)
 
إستخدمنا الـ exception الاساسي بالبداية وبعدها وضعنا متطلباته الذي ذكرناها قبل قليل bind ووضعنا الاتصال على local لدي و البورت 5555 , و استخدمنا listen للتنصت على الاتصال و بعده القبول accept وقلنا له اي شخص يتصل بالسيرفر يجب ان تطبع لنا الـ addr وقلنا اطبع لنا e اذا حصلت اي مشكلة.
 

إنشاء عميل بسيط client عبر مكتبة socket

ايضاً ( في الـ client لسنا بحاجة لعمل bind ولا listen ولا accept ) نحتاج فقط الاتصال connect.
import socket
#my client
try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("127.0.0.1",5555))
except socket.error as e:
    print(e)
 

نستخدم حصراً نفس البورت الذي في الـ server وهو 5555 مجرد ما السيرفر رأى client سوف يقول لنا السيرفر انه حصل اتصال.

 

إنشاء أداة لفحص البورتات المفتوحة و المغلقة

import socket
try:
      sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      port_list = [80,21,22,8080,4444,4545,4343,433]
      for p in port_list:
          scanning = sock.connect_ex(("172.217.18.46",p))
          if scanning == 0:
              print("{0}:is open".format(p))
          else:
              print("{0}:is close".format(p))
except socket_error as e:
    print(e)
وضعنا بالأداة فحص البورتات التالية [80,21,22,8080,4444,4545,4343,433] لفحص ايبي موقع جوجل ووضعنا شروط لها اذا كان 0 يكون بورت مفتوح و اي رقم غير الـ 0 يكون بورت مغلق و بالاخير اعطيناه اطبع لنا e اي القيم.
وعند تشغيل هذه الأداة ستكون النتيجة 
  1. 80: is open
  2. 21: is close
  3. 22: is close
  4. 8080: is close
  5. 4444: is close
  6. 4545: is close
  7. 4343: is close
  8. 433: is close
 
google-playkhamsatmostaqltradent