eshpilen
شنبه 25 دی 1389, 11:49 صبح
تازگی دارم یخورده برنامه نویسی سوکت میکنم که بعدا قراره در اینترنت کار کنه. البته دارم با UDP کار میکنم.
متوجه شدم که اگر Packet هایی که حجم اونها بیشتر از مقدار مشخص شده در دستور خواندن از سوکت هستن به برنامه ارسال بشن، برنامه با یک Exception خاتمه پیدا میکنه، چون دیتای دریافت شده در بافر دریافت جا نمیگیره.
میخواستم بدونم برای اینکه برنامم درصورت حمله یا ارسال تصادفی Packet های بزرگتر از حداکثر اندازهء Packet های نرمالی که خود برنامه دریافت میکنه متوقف نشه، بنظر شما باید چکار بکنم؟
آیا باید بافر دریافت رو روی حداکثر اندازهء ممکن برای Packet های UDP تنظیم کنم و این حداکثر چقدر هست؟
یا اینکه میگید بجای تنظیم بافر به حداکثر حجم ممکن برای Packet های UDP، باید کد دریافت دیتای سوکت رو در یک بلاک try - catch بذارم و Exception خاص مربوطه رو هندل کنم؟
قطعه کدهایی برای مثال:
برنامهء دریافت کنند:
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 50007))
print('UDP Server is waiting for packets...')
while True:
data=s.recv(1000)
print("UDP data received.")
برنامهء ارسال کننده:
import socket
remoteAddr = ('localhost', 50007)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data=b'x'*2000
while True:
input("hit Enter to send data...")
s.sendto(data, remoteAddr)
print("data sent.")
در این مثال ها، وقتی برنامهء ارسال کننده، دیتای ۲۰۰۰ بایتی رو ارسال میکنه، برنامهء دریافت کننده که حداکثر ۱۰۰۰ بایت دریافت میکنه دچار خطا میشه.
نکته: کدها به زبان پایتون (نسخهء ۳.۱) نوشته و تست شدن.
متوجه شدم که اگر Packet هایی که حجم اونها بیشتر از مقدار مشخص شده در دستور خواندن از سوکت هستن به برنامه ارسال بشن، برنامه با یک Exception خاتمه پیدا میکنه، چون دیتای دریافت شده در بافر دریافت جا نمیگیره.
میخواستم بدونم برای اینکه برنامم درصورت حمله یا ارسال تصادفی Packet های بزرگتر از حداکثر اندازهء Packet های نرمالی که خود برنامه دریافت میکنه متوقف نشه، بنظر شما باید چکار بکنم؟
آیا باید بافر دریافت رو روی حداکثر اندازهء ممکن برای Packet های UDP تنظیم کنم و این حداکثر چقدر هست؟
یا اینکه میگید بجای تنظیم بافر به حداکثر حجم ممکن برای Packet های UDP، باید کد دریافت دیتای سوکت رو در یک بلاک try - catch بذارم و Exception خاص مربوطه رو هندل کنم؟
قطعه کدهایی برای مثال:
برنامهء دریافت کنند:
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 50007))
print('UDP Server is waiting for packets...')
while True:
data=s.recv(1000)
print("UDP data received.")
برنامهء ارسال کننده:
import socket
remoteAddr = ('localhost', 50007)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data=b'x'*2000
while True:
input("hit Enter to send data...")
s.sendto(data, remoteAddr)
print("data sent.")
در این مثال ها، وقتی برنامهء ارسال کننده، دیتای ۲۰۰۰ بایتی رو ارسال میکنه، برنامهء دریافت کننده که حداکثر ۱۰۰۰ بایت دریافت میکنه دچار خطا میشه.
نکته: کدها به زبان پایتون (نسخهء ۳.۱) نوشته و تست شدن.