بسم الله الرحمن الرحیم


عنوان مقاله: with C++‎ Socket Programing

نویسنده : مهندس محمد صا بر ایرجی
ایمیل: Shantia20042004@yahoo.com
کلمات کلیدی:
IP: در شبکه هر کامپیوتر دارای آدرس میباشد , این عدد آدرس 32 بیتی , به عبارتی 4 قسمتی را IP گویند.
TCP: یکی از پروتکل های لایه انتقال در شبکه اتصالگرا میباشد
. (Transmission Control Protocol)
UDP: یکی از پروتکل های لایه انتقال در شبکه غیراتصالگرا میباشد .
CLIENT:کامپیوتری که در شبکه سرویس گیرنده است.
SERVER:کامپیوتری که به در خواستهای سرویس گیرنده ها پاسخ میدهد.
خلاصه:
امروزه با گسترش ارتبا طات و انواع شبکه های کامپیوتری جهت انجام امور نیاز مبرم به بر نامه های تحت شبکه از جمله socket programing احساس میشود , لذا در این مقاله به ا رائه مطالبی در این زمینه و ایجاد یک برنامه تحت شبکه(برنامه chat) میپردازم. در حقیقت این مقاله نقطه آغازی برای همه بر نامه نویسانی خواهد بود که به نحوی مجبور خو اهند شد برنامه کار بردی تحت شبکه اینترنت بنویسند.
برای یک ارتباط نیاز به موارد زیر است :
• ارتباط ادامه دار
• زبان مشترک
• معنای آدرس دهی
ارتباط عمومی:
پروتکلها : زبانهای مشترک اینترنت هستند.


انواع آدرس در اینترنت :
1- آدرس IP از جنس آدرس فیزیکی 161.12.188.167
2- نام Domain از جنس آدرس منطقی ex.iraji .com
آدرس IP آدرس 32 بیتی است که به 4 قسمت تقسیم می گردد محدوده اعداد در هر قسمت از 255- 0
می باشد.
5 طبقه بندی برای آدرس IP وجود دارد :



توابع API در C :
GETHOST BY NAME – NAME IP ADDRES
GET HOST BY ADDRES – IP ADDRES AQME

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



شماره پورت :
16 بیت صحیح است . برای ارتباط نیاز به آدرس IP و شماره پورت می باشد.

در TCP ارتباط تعریف می شود با


Unix در


در unix 1024 پورت اول برای هر دو نوع پورتکلها است و weu known ports نامیده می شود.



مدل tcp مبتنی بر اتصال است
قابل اطمینان smtr،http ،telnet ،ftp
رشته ای است (مسیل و نهر) (transmission control protocol / internet protocol)


مدلp ud غیر قابل اتصال
غیر قابل اطمینان tftp، nfs
دیتا گرامی است . ( بر اساس packet) (user datagram protocol) چکسام










مفهوم socket :
فرض کنید در محیطی کار میکنید که فقط با فایل ها سر و کار داریم ,در چنین سیستمی ورودی خروجی هم (I/O) میتواند تو سط سیستم فایلها مدیریت شود.به عنوان مثال, صفحه نمایش را همانند یک فایل متنی در نظر بگیرید برای ا ینکه اطلاعا ت را در صفحه نمایش بفرستیم باید فایل را از نوع نوشتنی باز کنیم و اگر محتوای اشاره گر فایل خالی نبود یعنی سیستم عامل به فایل حافظه اختصاص داد میتوان در فایل اطلاعات را نوشت.
میتوانیم این ساختار را برای ارتباط دو بر نامه کاربردی روی دو کامپیوتر گسترش دهیم , یعنی باید یک ارتباط با یک کامپیوترروی شبکه) با یک آدرس Ip خاص (و برنامه ای خاص روی کامپیوتر با آدرس پورت مشخص بگشاییم.
سوکت ، ترکیبی از یک آدرس IP و پورت TCP ویا پورت UDP است . یک برنامه ، سوکتی را با مشخص نمودن آدرس IP مربوط به کامپیوتر و نوع سرویس ( TCP برای تضمین توزیع اطلاعات و یا UDP) و پورتی که نشاندهنده برنامه است، مشخص می نماید. آدرس IP موجود در سوکت ، امکان آدرس دهی کامپیوتر مقصد را فراهم و پورت مربوطه ، برنامه ای را که داده ها برای آن ارسال می گردد را مشخص می نماید.درزیر نام چند پروتکل برنامه کاربردی و آدرس پورت آنها مشخص شده است:




بسیاری از برنامه های کاربردی تحت شبکه از یک شماره پورت خاصی برای ارسال و در یافت اطلاعات استفاده میکنند.به عنوان مثال برنامه فرستادن ایمیل به پورت 25 گوش میکند , ما در برنامه های کاربردی خود می توانیم از پورت دلخواه استفاده کنیم , به عنوان مثال شماره سوکت در یک برنامه تحت شبکه میتواند :2000 127.67.78.97 باشد که قالب کلی این آدرس به صورت Ip:Port میباشد .
مفهوم Sap :
در سمت client & server بسته های شکسته شده برنامه های کاربردی مربوطه با عبور از پورت مربوطه از لایه های دیگر شبکه عبور میکنند.این شماره پورت واسط بین لایه برنامه کاربردی و انتقال در حقیقت همان Sap میباشد .به شکل زیر نگاه کنید.



بنابراین ارتباط بین دو برنامه تحت شبکه مبادله اتلاعات بین دو نقطه TSap روی دو کامپیوتر در شبکه میباشد.همانطور که میتوان چندین فابل را همزمان باز نگه داشت در یک برنامه تحت شبکه همزمان میتوان چندین ارتباط باز و فعال داشته باشیم .مثلا از برنامه Yahoo messenger استفاده میکنیم در حقیقت ما از برنامه سمت client آن استفاده میکنیم و در server yahoo برنامه ای به پورتی که برنامه client اطلاعات را به آن میفرستد گوش میدهد.
انواع سوکت :
سوکت ها به طور کلی به 2 نوع میباشند:
1- سوکت های نوع stream که از نوع اتصالگرا هستند , یعنی باید قبل از مبادله اطلا عات یک اتصال به صورت لوله فرضی بین client و server بوجود میاید, این نوع سوکت ها بر مبنای tcp هستند.
2- سوکت های datagramکه از نوع بدون اتصال هستند , یعنی نیاز به برقراری ارتباط فرضی ندارند , پس هیچ امنیتی در این نوع ارتباط وجود ندارد, این نوع سوکت ها بر مبنایudp هستند.
همواره باید به این نکته توجه کرد که در برنامه های تحت شبکه ارتباطات دو طرفه میباشد, یک برنامه ای که در سمت سرویس گیرنده اجرا میشود و دیگری در سمت سرویس دهنده.برنامه نویسی سوکت مربوط به لایه کاربردی میباشد و انتقال بسته های اطلاعاتی به لایه های دگر بر عهده سیستم عامل میباشد.
قبل از وارد شدن در مقوله برنامه نویسی سوکت بد نیست الگوریتم کل کاری که بایستی در سمت سرویس دهنده همچنین در سمت مشتری انجام شود را بررسی نماییم :

الف) یک سوکت را که مشخصه یک ارتباط است بوجود بیاوریم . این قسمت باید نوع ارتباط خود با سیستم عامل را (tcp یا upd ) معرفی نماییم . این کار در محیط یونیکس توسط تابع ()socket انجام می گیرد .

ب) به سوکتی که باز کرده اید آدرس پورت نسبت می دهیم بدین صورت تمام بسته های Tcp یا upd ای که آدرس پورت مقصدشان با شماره پورت برنامه شما مطابقت دارد به سمت برنامه شما فرستاده می شود این کار توسط تابع سیستمی() bind انجام می شود.به این پورت ، پورت منفعل می گویند .



ج) حال باید به سیستم عامل بگوییم کارش را برای پذیرش تقاضاهای ارتباط شروع نماید.این کار توسط تابع سیستمی ()listen انجام می شود . چون ممکن است تعداد تقاضاهای ارتباط زیاد باشد باید حد اکثر تعداد ارتباط tcp را که می توان پذیرفت مشخص کرد و برای آن بافر در نظر گرفت.






د) در پایان باید از سیستم عامل بخواهیم که یکی از ارتباطات معلق را به برنامه شما معرفی کند . این کار توسط تابع () accept انجام می گیرد.


ه) از دستورات () send و ()recv برای مبادله داده استفاده می شود.
و) در پایان باید ارتباط خاتمه یابد . به دو صورت است:




در برنامه مشتری بایستی اعمال زیر را انجام داد :
الف) یک سوکت بوجود بیاوریم
ب) نیازی نیست مانند سرویس دهنده به سوکت خود آدرس پورت نسبت دهیم یعنی لزومی به استفاده از دستور bind نیست چرا که برنامه سمت client منتظر تقاضای دیگران نیست بلکه خودش متقاضی برقراری ارتباط است . بنا بر این با تابع connect تقاضا را به سمت server می فرستیم .
ج) از توابع ()send یا ()recv برای ارسال و در یافت داده اقدام کنید .
د) ارتباط را با توابع close یا shut down می بندیم .



توابع مورد استفاده در socket programming در :C
* توابع socket غیر واقعی :
Ret = parse _net work _args (args & argv & host & port &errmes)
تنظیمات مربوط به شبکه را انجام می دهد و ویرایش می کند. به دنبال host و port می گردد و آنها را منتقل می کند . در صورت موفقیت صفررا برمی گرداند.
**قسمت :server

1)-Port _sk = socket(af_inet ,sock_stream ):

2)-Port _sk = tcp _passive _ open (port)
در قسمت server اجرا می شود.
Port = تعداد rort هایی که به کار می رود .
است . Port- sk توصیفگر socket
3)-Bind (polt _ sk, &bind_ddr , addr _lenl);

4)- Client _sk = accept (port _sk , &bind _ addr ,&lenl);

:client قسمت ***
1)-Serr_ sk = tcp _active_open (host ,port)
Host = نام ماشین server
Port = شماره پورتی که به کار می رود
Server-sk = توصیفگر socket است .
آدرس IP و HOST پیدا می شود :
Host Ip = gethost by name(host name);
2) Ser v _sk = secket (af _ inetو sock _ stream;);
3) connect( ser v _skو &bind _addr و addr _len);
سوکت Serv _sk می تواند برای صحبت با سرور به کار رود .
Header files های اصلی در زبان c برای برنامه نویسی socket :

.<sys/ typas.h> لازمه انواع داده ای است
.<errno.h> ها می باشد error شماره
.<sys/sochet.n> و سیستمی را شامل میباشد socke ساختارها و ثابت های
.<netdb.h.h> ساختارهای مربوطه به شبکه ای را شامل می باشد
.<netinet/in.h > را شامل می شود socketتوابع مربوط .<arpa/inet.h> توابع کاربردی را شامل می باشد
توابع مدیریت داده در شبکه :
IP و نام dns یک host را بر می گردان * get host by name -
نام service و پروتکل را بر می گرداند. * get serv by name -
نام host را در شبکه محلی بر می گرداند. * get host name -
* get server by name get serv by port get servent
* getproto by name get proto by number get protobyeat
* get net by name get net by add get net ent

مقایسه ارسال و دریافت داده ها به روش : udp
روال در هر دو برنامه سمت client ،server به یک شکل است :
الف ) یک سوکت از نوع دیتا گرام ایجاد کنید . این کار با فراخوانی تابع ()socket با پارامتر sock-dgram انجام می شود
ب) با تابع ()bind به سکوت ایجاد شده آدرس پورت مورد نظرتان را نسبت دهید.
ج ) حال می توانید منتظر دریافت و یا ارسال داده ها باشید ( در دریافت آدرس برنامه مبداء ( آدرس ip و port ) مشخص می گردد و ارسال امکان پذیر است).

ارسال و دریافت با توابع انجام می شود.


د) سوکت ایجاد شده را ببندید .


نتیجه گیری:

بر اساس تمام برنامه های کاربردی تحت شبکه لایه چهارم مفهومی به نام سوکت است . این مفهوم به منظور برقراری ارتباط برنامه های تحت شبکه و تبادل جریان داده ها بین پروسه ها ابداع شد . لذا این مقاله نقطه آغازی برای همه برنامه نویسانی خواهد بود که به نحوی مجبور خواهند شد برنامه کاربردی تحت شبکه اینترنت بنویسند.

منابع :

* Internet working with tcp/ ip : uelumes I II III Douglas comer , prentice hall , 2000
* the whole internet user s guide & catalog by ed kroll; oreilly &associates

* socket Api programmer s refrence 2003