آموزش Socket Programming
----------------------------------------------
Socket Programming در ارتباطات شبکه قراردادهايی استفاده می شود تحت عنوان Protocol ,
پروتکولهای مختلفی ايجاد شده اما در ارتباطات اينترنتی و شبکه هايی که ارتباط ۲ طرفه است
بيشتر از نوع( TCP/IP ) استفاده ميشه که اساس اون به صورت خيلی مختصر اينه که برای هر
کامپيوتر که به شبکه (که اینترنت هم یه شبکه هستش !!) وصله يه IP مخصوص به خودش رو داره و به نوعی آدرس اون کامپيوتر محسوب ميشه که تمام خصوصيات يه آدرس رو که ميشه متصور شد داراست .
اما چرا گفتم در شبکه هايی که ارتباط ۲ طرفه نيازه از ( TCP/IP ) استفاده ميشه ؟
چون انواع ديگری هم از جمله UDP هستند که تقريبا ارتباط يکطرفه ميباشد مثلا برای پخش برنامه های راديويی .
-----------------------------------------------------------------------------------
اصلی ترين عامل در يک ارتباط شبکه ای Socket ميباشد که اعمال شبکه را بصورت خواندن و
نوشتن در يک فايل شبيه سازی نموده است . سوکت در اصل مانند يک کانال ارتباطی است
که ميان دو نقطه ايجاد شده و پيغامها رد و بدل ميشود.
برای داشتن يک ارتباط شبکه ای بايد يک سوکت ايجاد کنيم ( منظور نرم افزاری هستشا !! )
که لازمه اين کار اينه که بدانيم برای گوش دادن داريم ايجاد ميکنيم يا برای فرستادن پيام .
اگه برای فرستادن پيام باشه که پر واضحه که نياز به آدرس مقصد داريم . اما اين کافی نيست !!!
امروزه آپارتمان نشينی رونق گرفته و تو کامپيوتر هم نفوذ کرده !!!!
برای فرستادن نامه امروزه تنها آدرس ساختمون طرف کافی نيست و نياز به شماره واحد اون هو هست .
اين فقط يه تمثيل بود ! درسته تو کامپيوتر هم فقط IP کافی نيست و شماره واحد برنامه ای که گوش به زنگه هم نيازه که به اون Port ميگن . يعنی شماره پورت هم نيازه .
اما يه چيز يادم رفت بگم که IP از ۴ عدد ۰تا۲۵۵ تشکيل شده که با نقطه از هم جدا ميشن مثلا : ۱۶۸.۲۳.۵۶.۹۸ يه IP هستش . اما پورت اعدادی بين ۱ تا (بصورت رایج) ۶۵۰۰۰ را ميتونه شامل بشه .(بله بزرگتر از این عدد هم میتونه شماره پورت بشه اما چه کاریه !!!)

اينجا ممکنه يه سوال پيش بياد که مگه نه اينکه هر کامپيوتر فقط يه IP داره پس يعنی در يه لحظه آيا فقط به يه کامپيوتر ميتونه وصل شه ؟؟

جواب منفی است
درسته که IP يکی بيشتر نيست اما تعداد معتنابهی پورت داريم
يعنی با هر پورت به يه کامپيوتر متصل ميشيم و ميتونيم تا ۶۵۰۰۰ (می دونم بیشتره ;-) ) ارتباط از صدقه سری پورتها داشته باشيم .

اما اگه سوکت برای گوش دادن باشه تنها کافیه که برای ایجاد سوکت بگیم با چه شماره پورتی می خوایم ایجادش کنیم .


-----------
اولين نکته ای که لازمه بگم اينه که تو استفاده از سوکت در اول ايجاد پروژه حتما بايد چک باکس مربوط به WinSock رو تيک کنيد که تو درس بعدی با جزئيات بيشتری خواهم گفت .

در برنامه نويسی سوکت ۲ نوع ارتباط خواهيم داشت :


الف ) در هنگام دريافت يا ارسال پيغام تمام برنامه متوقف می شود که در بسیاری از موارد اصلا مطلوب نيست


ب) بر اساس Event پايه گذاری می شود که هر موقع پيغامی منتظر دريافت شدن بود آنرا دريافت کند و هر موقع پيغام آماده فرستادن بود آنرا بفرستد و کل برنامه از کار نيافتد که در اکثر موارد اين روش استفاده می شود .


-----------------------------------------------
تمام نيازهای مارا يک کلاس به نام CAsyncSocket تامين می کند . که با ساختن شئ از آن می توانيم به امکاناتی نظير send , Receive ,... دسترسی داشته باشيم که مفصلترش رو توضيح خواهم داد . که هرچی بعد از این از توابع اسم میبرم مربوط به این کلاس هستش

برای اين نوع ارتباط که داريم بحث می کنيم ۲ جور سوکت بايد بسازيم :




۱- برای فرستادن ۲- برای گوش دادن یا همون دریافت
برای ايجاد سوکت از متد;( ) Create استفاده میشه که ۲ نوع آن به این شکل است که :

۲- برای نوع دریافت کردن ۱ پارامتر نیاز دارد و آن شماره پورت برای دریافت کردن میباشد که به طور مثال :;( ۱۷۵۳) Create
۱- برای نوع فرستادن تنها کافیست که این متد بدون پارامتر صدا زده شود : ;( ) Create
-----------------------------------------------
بعد از ایجاد سوکت کار بعدی وصل شدن به برنامه مقصد هستش که منتظر دریافت پیغام هستش .
این کار از جانب فرستنده پیغام شروع میشه که باید متد;( ) Connect صدا زده بشه .
این متد ۲ پارامتر نیاز دارد :



۱- IP کامپیوتر مقصد یا آدرس تحت وب آن مثلا :" www.taraf.com" ( اگر در یک شبکه محلی میخواید وصل بشید اسم کامپیوتر هم میتونه جای IP به کار بره ) که بصورت یه رشته خواهد بود ۲- شماره پورت کامپيوتر مقصد که گوش به زنگ هستش
مثلا : ;(۱۳۶۵,"192.۱68. 12 .39")Connect

---------------------------------------------------
اما قبل وصل شدن نيازه که گوش به زنگ بشيم تا بتونيم درخواستهای اتصال رو جواب بديم برای اين کار از متد;( ) Listen بدون هيچ پارامتری استفاده ميکنيم تا سوکت دريافت آماده بشه .

---------------------------------------------------
حالا که به اينجا رسيديم وقتی تقاضای وصل شدن از سمت يه کامپيوتر ديگه به ما ميرسه رو بايد قبول کنيم :
گوش به زنگ هستيم که اگه تقاضايی رسيد با متد ;( ) Accept قبولش کنيم
اين متد يه پارامتر ميگيره و اون يه شئ از کلاس CAsyncSocket هستش که وظيفه دريافت متن پيغامهای بعد از متصل شدن رو به عهده ميگيره .

--------------------------------------------------
برای فرستادن پيغام از متد ;( ) Send استفاده ميکنيم که ۲ پارامتر ميگيرد :



۱- اشاره گر به بافر داده مورد نظر برای فرستادن است که با استفاده از تابع;(‌ ) LPCTSTR استفاده ميکنيم که يک پارامتر ورودی دارد و آن متغييری است که پيغام ما در آن است . ۲- طول بافر که همان طول پيغام می باشد
مثلا اگه پيغام در متغييری به نام str باشه به شکل زير ميفرستيم :
; (()str.GetLengthو(Send(LPCTSTR(str

-------------------------------------------------
وقتی پیغام به گوش دهنده برسه یه Eventبه نام;( ) OnReceive فعال میشه که با متد ;( )Receive پيغام را دريافت می کند که ۲ پارامتر می گيرد :



۱- اشاره گر به يک بافر که ميتواند يک رشته کاراکتری باشد ۲- طول بافر مورد نظر که به چه طولی از پيغام را مي خاهيم دريافت کنيم
بعد از اتمام کار با سوکت باید انرا ببندیم که این کار با متد ;( ) Close صورت میگیرد


منبع : irvirus.com