مكتبة socket
درس اليوم هو تكملة للدرس السابق في مكتبة 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'
>>>
>>> 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 الى.
الـ 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
>>>
>>> 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 و رجع لنا الرقم بشكل تفهمه الشبكة.
مثلا نريد عمل port scanner يجب ان نكون على دراية انه توجد ميثود بسيطة لعمل هذا, مثال
استخدمنا الـ exception الاساسي بالبداية وبعدها وضعنا متطلباته الذي ذكرناها قبل قليل bind ووضعنا الاتصال على local لدي و البورت 5555 , و استخدمنا listen للتنصت على الاتصال و بعده القبول accept وقلنا له اي شخص يتصل بالسيرفر يجب ان تطبع لنا الـ addr وقلنا اطبع لنا e اذا حصلت اي مشكلة.
لتحميل سكربتات الدرس اضغط على الرابط التالي في الصورة تحميل
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
>>> 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 بسيط حالياً
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)
#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 بسيط
ايضاً ( في الـ client لسنا بحاجة لعمل bind ولا listen ولا accept ) نحتاج فقط الاتصال connect.
ايضاً ( في الـ 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)
#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)
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 اي القيم.
وعند تشغيل هذه الأداة ستكون النتيجة
80: is open
21: is close
22: is close
8080: is close
4444: is close
4545: is close
4343: is close
433: is close
لتحميل سكربتات الدرس اضغط على الرابط التالي في الصورة تحميل
تعليقات
إرسال تعليق