مدیریت دانلود‌های همزمان از یک سایت و بحث تایم آوت
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

یک سرویس ویندوز ان تی با سی شارپ نوشته‌ام که کارش مراجعه به یک سری آدرس RSS و ذخیره سازی آنها به صورت آنالیز شده در یک دیتابیس SQL server است (این مورد ضعفی است که اکثر برنامه‌های فیدخوان دارند و پس از مدتی کار با آنها این احساس را دارید که اطلاعات گذشته را از دست داده‌اید).
در طی آزمایش اولیه این سرویس، به مشکل عجیب timeout پس از باز کردن برای مثال سومین یا چهارمین thread همزمان برای دانلود کردن اطلاعات بر خوردم. همه چیز درست بود، از کلاس‌ها، دریافت اطلاعات از وب و غیره، اما برنامه کار نمی‌کرد. این مشکل فقط هم با feedburner.com رخ می‌داد (همانطور که مطلع هستید feedburner.com سرویسی را جهت پیگیری آمار مشترکین فیدهای شما ارائه می‌دهد که بسیار جالب است. برای مثال چند نفر مشترک دارید، یا یک سری نمودار و غیره. به همین جهت رسم شده است که اکثر سایت‌ها فیدهای خودشان را در این سایت نیز ثبت می‌کنند).
پس از مدتی جستجو به نکته جالب زیر برخوردم که شاید برای شما هم در آینده مفید باشد:
مطابق RFC2068 - Hypertext Transfer Protocol -- HTTP/1.1 ، شما تنها مجازید 2 کانکشن فعال به یک سایت باز کنید. این علت تایم آوت در سومین thread ایجاد شده بود. برای مثال IE این مورد را محترم می‌شمارد. در دات نت نیز به صورت پیش فرض این محدودیت قرار داده شده است که به‌سادگی می‌توان آنرا تغییر داد. برای این منظور باید یک فایل app.config به پروژه اضافه کرد و سپس خطوط زیر را به آن افزود:

<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>


بعد از این تغییر مشکل timeout برنامه حل شد.

برای مدیریت چندین ترد همزمان دانلود کننده و در صف قرار دادن آنها در این پروژه، از کتابخانه سورس باز زیر استفاده کردم:
http://www.codeplex.com/smartthreadpool

مآخذ:
http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx
http://www.faqs.org/rfcs/rfc2068.html
http://vahidnasiri.blogspot.com
http://odetocode.com/Blogs/scott/archive/2004/06/08/272.aspx

پ.ن.
برای اینکه در بلاگر بتوانید متون حاوی xml را ارسال کنید باید از سرویس زیر استفاده کنید
http://www.elliotswan.com/postable/
  • #
    ‫۱۵ سال و ۱۲ ماه قبل، یکشنبه ۵ آبان ۱۳۸۷، ساعت ۲۲:۰۷
    برای دور زدن دانلوداز سرورهای مختلف که مشکل محدودیت کانکشن فعال دارند هم می شود از اینها استفاده کرد ؟ البته من این کار رو برای دانلود نمی خوام ، بلکه قصد نهایی باز کردن تعداد بسیار زیاد کانکشن به یک سرور خاص و نهایتا از کار انداختن آن است . چیزی مثل حملات DDOS .
    البته من فکر نمی کنم این حرفی که شما زدید در این مورد که من گفتم کار کند چون معمولا Firewallهایی که روی سرور هست این اجازه رو به شما نمیده . و نهایتا همه رو می بنده .
    در این مورد می تونید راهنمایی کنه ؟
  • #
    ‫۱۵ سال و ۱۲ ماه قبل، یکشنبه ۵ آبان ۱۳۸۷، ساعت ۲۲:۵۵
    در این مورد خیر.
    اگر سرور یا حتی برنامه برای این نوع حملات آماده نشده باشند، بله. این روش‌ها می‌تونه عملیات سایت رو مختل کنه. البته هدف من فقط دریافت فید از یک سایت مادر بود :)
    مطلبی رو چند وقت پیش در سایت آقای Omar AL Zabir دیدم که در همین ارتباط بود. نحوه ایجاد این نوع حملات و نحوه دفاع توسط یک برنامه هوشمند که برای این موارد آماده شده:
    مشاهده مطلب:
    http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx
    مثالی هم که در سایت ایشون برای حمله عنوان شده عملا با پیش فرض‌های دات نت (حداکثر 2 کانکشن همزمان) کار خاصی رو انجام نمیده و نهایتا timeout خواهند گرفت، مگر اینکه ...
  • #
    ‫۱۵ سال و ۱۲ ماه قبل، چهارشنبه ۸ آبان ۱۳۸۷، ساعت ۱۶:۰۳
    لینک خوبی بود اما کافی نبود اگر بعدا چیز بهتری پیدا کردی یکجایی توی وبلاگت بنویس ( چون این وبلاگ رو دنبال می کنم و حتما پیگیری می کنم )‌
    این رو هم بگم که اصولا من این کار رو واقعا برای هک یا خوابوندن سرور نمی خوام اما برام جالب شد که اگر این اتفاق بیفته خیلی خطات دیگه هم می تونه بوجود بیاد .
    زیاد وقتت رو نمی گیرم ولی اگر تونستی در ارتباط با سوال من یک پست بنویس فکر کنم برای خیلی ها جالب باشه . ممنون
  • #
    ‫۱۵ سال و ۸ ماه قبل، چهارشنبه ۳۰ بهمن ۱۳۸۷، ساعت ۱۸:۳۶
    سلام
    من دنبال یه راهی میگشتم که با استفاده از خود سی شارپ بشه تشخیص داد که به اینترنت کانکشن داریم یا نه؟
    System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
    این فقط شبکه ها رو برمیگردونه ولی تشخیص کانکت بودن به اینترنت رو نمیده.
  • #
    ‫۱۵ سال و ۸ ماه قبل، چهارشنبه ۳۰ بهمن ۱۳۸۷، ساعت ۱۹:۱۳
    راهی که در تمام زبان‌های برنامه نویسی برای چک کردن مطمئن دسترسی به اینترنت وجود دارد دانلود کردن یک صفحه از اینترنت است. عموما سایت گوگل پیشنهاد می‌شود چون احتمال داون بودن آن در حد صفر است.
    با استفاده از HttpWebResponse صفحه اول گوگل را دانلود کنید. اگر StatusCode مربوط به GetResponse مساوی OK بود یعنی دسترسی به اینترنت دارید.
  • #
    ‫۱۵ سال و ۸ ماه قبل، پنجشنبه ۱ اسفند ۱۳۸۷، ساعت ۱۴:۵۹
    خیلی ممنونم