تالار گفتمان مانشت
مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - نسخه‌ی قابل چاپ

صفحه‌ها: ۱ ۲
مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۱ شهریور ۱۳۹۱ ۰۶:۰۶ ب.ظ

سلام دوستان استادمون گفته باید یه برنامه تحت شبکه بنویسیم که سیستم چت دو نفره رو پیاده سازی بکنه من در مورد سوکت پروگرمینگ تحقیق کردم و با توابع و استراکچرهاش آشنا شدم ولی نمیتونم خوب پیاده سازیش کنم در مورد برنامه های مولتی ترد هم زیاد چیزی نمیدونم و نمیدونم چطور اجرا میشن ... زبان برنامه نویسیمون c++ هست و سوکت تحت لینوکسه کتاب احسان ملکیان بخش ۷ در مورد سوکت پروگرمینگش رو هم خوندم ولی خیلی خوب نمیتونم اون مثال آخر در مورد چاپ hello رو تحلیل کنم ممنون میشم راهنمایی کنید

مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - alirrrrrr - 01 شهریور ۱۳۹۱ ۰۶:۱۸ ب.ظ

باید واسه چت روم باید از tcp استفاده کنی دوست من.
و روال کار هم اینطوره که یه برنامه client می نویسی و یه برنامه سرور.
که درون برنامه سرور به ازای کانکت شدن هر برنامه کلاینت به سرور باید یه thread جدید ایجاد بشه تا به خط اون کلاینت مورد نظر گوش کنه.
چت دو نفره هم که خیلی راحت تره (یعنی اگه چند نفره نباشه).به هر برنامه ۱ پورت خاص بده یعنی مثلا یکی پورت ۳۰۰۰ و دیگری ۳۰۰۱ که دیگه نیازی به thread نداری!
و حین گوش دادن به خط هم هیچ مشکلی پیش نمیاد.
البته اگه مشکلی واسه خط گوش دادن پیدا کردی میتونی توی c# از کد Application.DoEvents استفاده کنی.

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۱ شهریور ۱۳۹۱ ۰۶:۲۹ ب.ظ

آخه باید با thread پیاده سازی کنیم و من نمیدونم چه طوری باید یه ترد ایجاد کنم
چرا باید دوتا پرت بدم مگه نباید شماره پرت ها در سمت سرور و کلاینت یکی باشن؟ برنامه بین سرور و یک کلاینته نه دوتا کلاینت
شایدم دارم اشتباه میکنم نمیدونم

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - blackhalo1989 - 01 شهریور ۱۳۹۱ ۰۷:۱۵ ب.ظ

(۰۱ شهریور ۱۳۹۱ ۰۶:۲۹ ب.ظ)فوژان نوشته شده توسط:  آخه باید با thread پیاده سازی کنیم و من نمیدونم چه طوری باید یه ترد ایجاد کنم
چرا باید دوتا پرت بدم مگه نباید شماره پرت ها در سمت سرور و کلاینت یکی باشن؟ برنامه بین سرور و یک کلاینته نه دوتا کلاینت
شایدم دارم اشتباه میکنم نمیدونم
ترد برای وقتی هست که میخواید چند مسیر اجرای متفاوت برای گوش کردن برای کلاینت های جدید و تبادل اطلاعات با کلاینت های قبلی داشته باشید.
شماره پورت مربوط به پراسس میشه و الزامی نداره در سمت سرور و کلاینت یکی باشه فقط باید دو طرف شماره پورت همدیگه رو داشته باشن.
یه دوره خوب برای ساکت پروگرمنیگ(این صفحه اولشه):

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.


RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۱ شهریور ۱۳۹۱ ۰۷:۳۰ ب.ظ

ممنون میشم یکم بیشتر توضیح بدید که من چطوری باید شماره پرت بدم چون تنها تصوری که دارم از پرت و نحوه عدد دادن بهش اینه که اول برنامه میایم define یه شماره بهش میدیم بعد با htons اون مقدار رو انتساب میدیم و اینکه من چطور به کلاینت پیغام بفرستم؟

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - Helmaa - 01 شهریور ۱۳۹۱ ۰۹:۰۲ ب.ظ

تاپیک منتقل شد.

مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۱ شهریور ۱۳۹۱ ۱۱:۴۷ ب.ظ

(۰۱ شهریور ۱۳۹۱ ۰۹:۰۲ ب.ظ)Helmaa نوشته شده توسط:  تاپیک منتقل شد.
ممنون
دوستان اگر کمک کنید ممنون میشم چون واقعا الان حس میکنم دو روز وقتم رو برای مطالعه سوکت حروم کردم و چیزی یاد نگرفتمSadUndecidedHuh

مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - alirrrrrr - 02 شهریور ۱۳۹۱ ۱۲:۱۹ ق.ظ

شما اگه بخاید برنامه ای که شامل تعداد نا مشخصی کلاینته بنویسید ،باید از تردینگ استفاده کنید .
ولی اگه بخاید برنامه ای برای ارتباط دو تا کلاینت بنویسید میتونید با یه کد ساده و بدون حتی نیاز به thread اونو بسازید.
در مورد ترد که گفتید خیلی آنچنان چیز پیچید ای نیستش.البته من درون c# کار کردم که مطمئنا کلیتش توی Visual C++ هم به همون شکله.
بدین شکله تردینگ که شما یک تابع به عنوان هسته مرکزی یک ترد میسازین و اون تابع یا رویه به عنوان عنصر جداونه ای ای همزمان با ترد اصلیتون که همون برنامه ی اصلیه اجرا میشه که اینجا زمانی که سرور میخاد همزمان به چندین خط (پورت) گوش کنه و پاسخ بده که این هم واسه اینه که چندین تا برنامه کلاینت(که همگی از یک نوعند) میخان همزمان با این سرور رابطه و مراوده داشته باشن.پس ردینگ رو برای برنامه سمت سرورت نیاز داری.
و همینطور نحوه برقراری ارتباط چند کلاینت با هم مثل یک چت روم واقعی هم ،شما باید یک پورت خاص رو درون برنامه سرور به ورود و خروج کلاینت ها قرار بدید.بدین شکل مثلا هر کلاینتی برای اعلام ورود یا خروجش باید اونو با ارسال نام+ورودیه یا خروجیه رو به سرور بفرسته و سرور پس از دریافت پیام برای accept اون یک شماره پورت رو به اون کلاینت بده و همینطور یک شی از thread برای اون کلاینت ایجاد کنه تا من بعد مراوده سرور با کلاینت توی thread انجام بشه.وکلاینت هم بعد از دریافت شماره پورتش ،متوجه پذیرفته شدنش میشه .این شماتیک کلی یک چت رومه

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - Helmaa - 02 شهریور ۱۳۹۱ ۱۲:۲۵ ق.ظ


مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.
هم دو نمونه برنامه چت بررسی شده چون کارت فوری هست میتونی ازشون کمک بگیری البته به زبان سی شارپ نوشته شده.

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - p.parsaee - 02 شهریور ۱۳۹۱ ۰۱:۳۰ ق.ظ

سلام دوست گرامی
برای فهم بهتر مفهوم سوکت و سوکت پروگرامینگ متن زیر رو مطالعه کنید:
برای ارتباط بین پردازش های مختلف روی یک هاست سیستم عامل از ارتباط بین پردازشی استفاده می کنه. اما اگه دو پردازش روی دو هاست مختلف باشن ارتباط بین اونها با استفاده از پاس کاری پیام بین هر دو انجام میشه. به پردازشی که ارسال پیام رو شروع می کنه پردازش کلاینت و به پردازشی که جواب پردازش کلاینت رو می ده پردازش سرور می گوئیم.
به طور کلی دو نوع پیام داریم: پیام درخواست – پیام جواب. پردازش کلاینت پیام درخواست رو به پردازش سرور میفرسته و پردازش سرور در جواب پیام جواب رو به پردازش کلاینت میفرسته.
پاس کاری پیام بین پردازش کلاینت و پردازش سرور بوسیله سوکت ها انجام میشه. سوکت ارتباط بین پردازش و پروتکل مورد استفاده در شبکه برای پاس کاری پیام رو برقرار می کنه (مثل tcp). در واقع سوکت یک در بین پردازش و پروتکل انتقال پیام هست. هم پردازش سرور و هم پردازش کلاینت یک سوکت برای خود دارند.
اما خوب هر پردازش برای شناسایی شدن در شبکه یک شماره منحصر به فرد داره که از ترکیب آدرس IP هاستی که پردازش درش قرار داره و شماره پورت متصل به پردازش تشکیل میشه.
اگر پروتکلی که استفاده می کنید tcp باشه روال پاس کاری پیام به این صورت هست:
۱- پردازش سرور قبل از پردازش کلاینت اجرا میشه و بعد پردازش کلاینت اجرا میشه.
۲- پردازش کلاینت با پردازش سرور تماس میگیره. برای این کار پردازش کلاینت باید یک سوکت برای خود بسازه و در آن شماره IP سرور و شماره پورت پردازش سرور رو مشخص کنه.
۳- سرور یک سوکت برای پردازش سرور ایجاد میکنه تا این پردازش بتونه با پردازش کلاینت پیام پاس کاری کنه. به ازاء هر کلاینت که بخواد پیام پاس کاری کنه، سرور یک سوکت ایجاد میکنه.
۴- بعد از اینکه ارتباط برقرار شد، کلاینت پیام درخواست به سوکت پردازش سرور ارسال می کنه، سرور اونو میخونه و پردازش میکنه، در جواب سرور هم پیام جواب رو برای پردازش کلاینت میفرسته. کلاینت پیام رو میخونه. اگه درخواست جدیدی داشته باشه همین روال درخواست و جواب ادامه پیدا می کنه وگرنه سوکت رو میبنده. در نهایت سرور هم سوکت رو میبنده.

برای پیاده سازی این نرم افزار با زبان سی شارپ بدین طریق عمل کنید:
یک پروژه برای برنامه کلاینت و یک پروژه دیگر برای برنامه سرور بسازید. برای نگهداری کاربران از بانک اطلاعاتی استفاده کنید. بانک اطلاعاتی بر روی سرور نگهداری میشود.
در برنامه کلاینت، اگر خواستید می توانید از تشخیص هویت استفاده کنید و کلاینت حتما باید یک نام کاربری و کلمه عبور برای ورود داشته باشد. (در صورتی که یک کلاینت و یک سرور دارید اختیاری است و در صورتی که کلاینتها بیشتر باشد بهتر است).
بعضی از کدهایی که کمکتون می کنه اینا هستن:
برای شروع ارسال پیام از طرف برنامه کلاینت این کد را بنویسید:
کد:
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// Specifying IP Address Of Server
IPAddress ipAddress = IPAddress.Parse("192.168.0.1");

// Specifying Port Number Of Server Socket
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1000);

// Connecting To Server Socket
clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null);
کد واضح است. تنها خط آخر بیان می کند که بعد از وصل شدن به سرور باید متد OnConnect اجرا شود که باید در آن پیام هایی که می خواهید برای سرور بفرستید را مشخصی کنید و دستورات لازم دیگر برای ارسال پیام و قالب پیام هم باید مشخص شوند.
در برنامه سرور با استفاده از کلاس Socket کد زیر را در رویداد Load صفحه بنویسید:
کد:
// Creating Server Socket
Socket  serverSocket = new Socket(AddressFamily.InterNetwork,
                          SocketType.Stream,
                          ProtocolType.Tcp);

// Specify IP Address and Port Number 1000
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1000);

// Binding ipEndPoint to Socket and Listen to Port
serverSocket.Bind(ipEndPoint);
serverSocket.Listen(4);

// Accepting Clients
serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
کد واضح است. تنها خط آخر کد بیان می کند که در صورتی که یک پیام درخواست از طرف کلاینت رسید متد OnAccept رو به صورت نامتقارن فراخوانی کن. این متد را باید پیاده سازی کنید و بیان کنید که به ازاء این کلاینت یک سوکت جدید ایجاد شود. در همین حین به صورت نامتقارن به درخواست کلاینتهای دیگر گوش دهیم و درنهایت پیام را از همین کلاینت دریافت کنیم.


مطالب تئوری رو از اسلاید فصل دوم این کتاب ترجمه کردم: (اسلایدهاش free بودن موقع ما)
کد:
Computer Networking: A Top Down Approach,
۴th edition.
Jim Kurose, Keith Ross
Addison-Wesley, July 2007.
کدهای سی شارپ هم از یکی از دوستان گرفته شده.

التماس دعا
موفق باشید

مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - arichoana - 02 شهریور ۱۳۹۱ ۱۰:۴۹ ب.ظ

تو سایت codeproject برو سرچ کن چیزای خوبی گیرت میاد
یه سایت هم هست به اسم
مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.
که پروژه های خفنی توش داره و خوراک پروژه های دانشجوییه منتها یا باید پول بدی عضو شی یا اینکه چند تا از برنامه های آستو واسشون آپلود کنی بهت سهمیه دانلود بدن

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۳ شهریور ۱۳۹۱ ۰۲:۱۵ ب.ظ

واقعا از همه ی شما دوستان ممنونم
من در مورد thread چیز زیادی نمیدونم و نمیدونم چطور باید یک thread ایجاد کرد اگر pdf یا کتابی هست که بشه دانلود کرد یا حتی خرید ممنون میشم معرفی کنید چون این پروژه نیست فقط یه تمرین کلاسیه و من هدفم یاد گیریه نه نمره چون اصلا نمره ای در کار نیست

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۴ شهریور ۱۳۹۱ ۱۱:۴۰ ب.ظ

دوستان کسی نبود راهنمایی کنه Huh

RE: مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - فوژان - ۰۶ شهریور ۱۳۹۱ ۱۰:۲۵ ب.ظ

کسی ایده ای نداشت؟
دوستان کسی میدونه پارس کردن یک فایل یا کلاس یا ... در سی پلاس پلاس چیه و چه کاربردی داره؟

مشکل در برنامه نویسی تحت شبکه(خیلی مهم) - blackhalo1989 - 07 شهریور ۱۳۹۱ ۱۰:۲۰ ب.ظ

یعنی توکن هاشو در بیارید ازش.