ورود

نسخه کامل مشاهده نسخه کامل : سی شارپ برنامه نویسی شبکه Socket



Ehsan-l-able
08-03-2013, 11:55
سلام
چند سوال در رابطه با برنامه نویسی سوکت در سی شارپ دارم که برام مبهمه !!!!!

من در یک کافی نت 10 تا کلاینت دارم. برنامه ای میخوام بنویسم که وقتی نسخه کلاینت روی تک تک کلاینت ها اجرا میکنم به سرور وصل بشه و قابلیت ارسال پیام رو داشته باشه. نکته ای که هست اینه که نمیخوام سوکت قطع بشه میخوام سرور هز زمانی که میخواد یک پیام به کلاینت بفرسته . نه اینکه بیاد دوباره سوکت بسازه پیام بفرسته و قطع کنه . نمیدونم میتونم منظورم رو برسونم [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

1- چطوری باید اینکار رو انجام بدم ؟ روال کار به چه شکلیه ؟
2- آیا برای 10 کلاینت باید 10 تا سوکت ایجاد بشه ؟ (مثال)
3- آیا هر کلاینت باید با یک پورت مجزا به سرور وصل بشه ؟ یعنی سرور باید روی 10 پورت شنود کنه؟ (مثال)
4- وقتی بخوام به فرض مثال به کلاینت 5 یک متن بفرستم از توی سرور چطور تشخیص بدم به کدام سوکت باید پیغام بدم؟
5- اصلا از کجا بفهمم که سوکت هنوز وصله ؟
6- در ضمن برای ارسال هر دستور در یک Thread جداگانه دستورات رو باید به چه شکلی بنویسم ؟

دوستان عزیز اگه امکان داره با مثال برام توضیح بدید راستش پروژه ترم آخره خیلی نیاز بهش نیاز دارم.
با تشکر

Msba
08-03-2013, 18:05
من نظری دارم اما دوستانی که تجربه بیشتری دارند نیز ما را محروم نسازند.
لازم نیست 10 سوکت به ازای هر کلاینت باز باشه. بلکه شما در پکت ارسالیتان از طرف کلاینت مشخص بکنید که کدام کلاینت در حال ارسال اطلاعات هست مثل خود اترنت که آدرس فرستنده در سگمنت ارسال هست.
این طوری در سرور می فهمید که اطلاعات آمده از کدام کلاینت هست.
حالا بریم سراغ سرور:
خوب مشخص هست که آدرس کلاینت ها متفاوت هست، همه هم نمی خواهند اطلاعات بگیرند ( Broadcast )، یک پیغام هم لازم نیست تا عده ای دریافت کنند ( Multicast ). پس می بایست یک سوکت خاص به یک آدرس و پورت خاص متصل شود. پس در هر ارسال می شود یک سوکت زد. اما حالا یک نکته وجود دارد:
حجم اطلاعات ارسالی در یک بازه ی ثابت حدودا چه قدر هست؟
اگر زیاد هست پس لازم است تا سوکت باز بماند چرا که negotiate اولیه سوکت بارها و بارها صورت می گیرد و این خود باعث کند شدن جابه جایی اطلاعات می گردد.
اگر هم کم است باز هم باید باز باشد :n06:، چرا؟
چون که اگر کلاینت قطع شد این طوری متوجه بشیم. از پراپرتی Connected در خود سوکت، نه!. در ارتباطات مابین دستگاهی یک پکت وجود دارد به نام Live. که خود Ethernet هم داره. با جابه جایی این پکت متوجه حضور کلاینت می شویم. این پکت رو باید خودمون بسازیم چرا که ممکن هست برنامه ما در کلاینت بسته بشه پس در لایه 7 خودمون باید یک پکت live بسازیم.

برای مابقی سوالات هم سعی دارم پاسخ با کد قرار بدم.

موفق باشید.

Ehsan-l-able
08-03-2013, 20:55
>> لازم نیست 10 سوکت به ازای هر کلاینت باز باشه. بلکه شما در پکت ارسالیتان از طرف کلاینت مشخص بکنید که کدام کلاینت در حال ارسال اطلاعات هست
>> پس می بایست یک سوکت خاص به یک آدرس و پورت خاص متصل شود. پس در هر ارسال می شود یک سوکت زد. اما حالا یک نکته وجود دارد:

چون که اگر کلاینت قطع شد این طوری متوجه بشیم. از پراپرتی Connected در خود سوکت، نه!. در ارتباطات مابین دستگاهی یک پکت وجود دارد به نام Live. که خود Ethernet هم داره. با جابه جایی این پکت متوجه حضور کلاینت می شویم. این پکت رو باید خودمون بسازیم چرا که ممکن هست برنامه ما در کلاینت بسته بشه پس در لایه 7 خودمون باید یک پکت live بسازیم.



ممنون از پاسختون.
مشکلی برای اینکه سرور بفهمه کدوم کلاینت پیغام فرستاده نیست . همون طور که گفتید کلاینت در پک ارسالی مشخص میکنه .
اما در رابطه با سرور شما گفتید نیازی نیست 10 تا سوکت باز باشه !!! اما در ادامه گفتید برای هر کلاینت یک سوکت خاص به یک آدرس و پورت خاص متصل بشه !!!!!

برنامه سرور رو اجرا میکنم یک سوکت ایجاد میشه و با شنود روی یک پورت منتظر ارتباط میشود. یک لیست باکس در برنامه سرور ، تمام کلاینت های کانکت شده رو نمایش میده.
برنامه کلاینت در زمان اجرا در رویداد "فرم لود" به سرور با آی پی و پورتی که از قبل تنظیم شده به سرور کانکت میشه (با حداکثر سرعت !) در thread جدا.
یک کلاینت دیگه برنامه رو اجرا میکنه اون هم کانکت میشه و به لیست سرور اضافه میشه. به همین ترتیب تا مثلا 50 کلاینت.

خب حالا میخوام سرور یک کلاینت رو به دلخواه انتخاب کنه و یک رشته متنی مثلا (Shutdown) به اون کلاینت ارسال کنه.

اگه برنامه کلاینت در یکی از سیستم بسته شد ، از لیست سرور خودکار حذف بشه (در رویداد form closing) قبل از خروج کامل یک دستور مبنی قطع شدن سوکت بفرسته.

senaps
08-03-2013, 22:41
ببخشید، من دو سوال برام پیش اومد
۱-میشه سرورتون رو که میخواد اینکارو بکنه رو هم به من معرفی بکنین؟
ظاهرا من گاهی اوقات به ملت سیستم های الکی برای سرور پیشنهاد کردم....مشخصات سرورتون چیه؟؟؟
۲-هدف از بستن سوکت ها چیه؟!

Msba
08-03-2013, 22:53
اما در ادامه گفتید برای هر کلاینت یک سوکت خاص به یک آدرس و پورت خاص متصل بشه !!!!!

نه اشتباه نشه. هر کلاینت یک سوکت خاص به یک آدرس و پورت خاص بزنه به سرور نه بر عکس!!!:n08:
که اون آدرس آدرس سرور هست. در واقع سوکت روی سرور دارای IpEndPoint برابر با Any است. که هر کی می تونه بهش وصل بشه با ماکزیمم Listen برابر با int.MaxValue .

کلاینت نباید اعلام کند هست یا نه. سرور باید بفهمد هست یا نه. چرا؟ چون ممکنه کلاینت ریست بشه نه برنامه بسته بشه که بخواهد بگه "ما رفتیم!"
شما در یک Thread یک Timer راه بنداز که در بازه های 200ms یک پکت بفرسته بگه " هستی؟" کلاینت هم باید بگه هستم.
و اگر 1 ثانیه گذشت و نگفت "هستم" باید سرور بفهمه که کلاینت رفته است در دیار باقی!:n01:

یک مثال می گذارم.

موفق باشید.

Ehsan-l-able
09-03-2013, 20:19
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

سلام مجدد. راستش مشکل من کانکت شدن کلاینت ها با سروره .
یه بار اجرا میکنی کانکت میشه کار میکنه.
فردا برنامه رو میبری نشون یکی بدی میخوای کانکنت بشی نمیتونه !!! خطای time out میگیره
برنامه رو میبندی ، پورت هنوز بسته نشده دوباره کانکنت میشی خطای No connection could be made because the target machine actively refused it ip:port
اعصاب برات نمیذاره :n24:
کلا اتصال با سرور خیلی کند صورت میگیره در صورتی که برنامه هایی هستند در کمتر از 3 ثانیه به سرور وصل میشن !!!! ارسال و دریافت هم خیلی سریع انجام میشه.

_H2_
09-03-2013, 23:08
سلام
برنامه نویسی مستقیم با سوکت ها کمی پیچیدگی های فنی درک مفاهیم سوکت ها و مباحث چند ریسمانی و سریالی و دی-سریالی و... را دارد که میتواند کمی مشکل و تولید را زمان بر کند.

برای اغلب کارهای معمول تکنولوژی WCF راه کارهای ساده تر با توسعه سریعتر و مطمئن تری در اختیارتان قرار میدهد.

پیشنهاد میکنم بجای استفاده مستقیم از سوکت ها روی WCF تمرکز و تحقیق کنید، انشاا... زودتر و با ضریب اطمینان بیشتری به هدف تان خواهید رسید.

تاپیکی در خصوص WCF
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

(((
تاپیکی در خصوص Socket
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
)))
موفق باشید.

Ehsan-l-able
13-03-2013, 14:56
تو برنامه نویسی سوکت خیلی به این خطای برخوردم :

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.10.1:9000

توی localhost یا آی پی 127.0.0.1 اجرا میکنم جواب میده ، اما تو شبکه جواب نمیده ! فایروال هم غیر فعال کردم نشد !

_H2_
15-03-2013, 22:42
سلام
خطای شما مربوط به عدم برقرای ارتباط (در زمان مقرر) است.
شاید افزایش timeout کمکی کند ولی یاخط ارتباطی و یا کدتان مشکل دارد و بدون دیدن کد نظر دقیقی نمیتوان داد.

Ehsan-l-able
16-03-2013, 11:26
سلام
خطای شما مربوط به عدم برقرای ارتباط (در زمان مقرر) است.
شاید افزایش timeout کمکی کند ولی یاخط ارتباطی و یا کدتان مشکل دارد و بدون دیدن کد نظر دقیقی نمیتوان داد.

این سورس کد خیلی ساده :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

اما من سورس های دیگه ای هم امتحان کردن وقتی روی یک سیستم اجرا میکنم و آی پی سرور رو 127.0.0.1 میدم مشکلی نداره اما در LAN با دو تا سیستم همین خطا رو میگیره !!!!

senaps
16-03-2013, 13:05
ایا اون دو سیستم به هم میتونن پینگ بکنن؟
اگر برنامه به درستی کار میکنه و پورت ها و IP و... هیچ مشکلی ندارن، مشکله مشکل از برنامه نباشه و از شبکه باشه؟

Ehsan-l-able
16-03-2013, 13:30
آقا من از همه عزیزان عذرخواهی میکنم

بعضی وقت ها یه موارد خیلی پیش پا افتاده فراموش میشه بعد برای حلش یه جای دیگه دنبالش میگردیم.

مشکل از فایروال Nod32 بود.

بازم از همه دوستان که منو راهنمایی کردند عذرخواهی می کنم.