socket programming in c++

27
ی سوکت برنامه نویسوسفی نژاد احمد ی1

Upload: saeeddelphi

Post on 17-Jul-2015

215 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Socket Programming in C++

برنامه نویسی سوکتاحمد یوسفی نژاد

1

Page 2: Socket Programming in C++

سرفصل ها

معرفی سوکت و برنامه نویسی سوکت•دو مدل اساسی از سوکت ها•

ایجاد کردن یک سوکت–socketتابع •ساختارهای سوکت•روش های ذخیره سازی داده ها•

و طریقه کار با آنهاIPآدرس های •

2

Page 3: Socket Programming in C++

سرفصل ها

روی چه پرتی هستم؟–bindتابع •!سالم–connectتابع •!لطفا با من تماس بگیرید–listenتابع •!سپاس از تماس شما–acceptتابع •انتقال داده–recvو sendتوابع •بای بای–closeتابع •TCPترتیب استفاده توابع در پروتکل •

UDPو TCPخالصه توابع در پروتکل •

منابع•

3

Page 4: Socket Programming in C++

معرفی سوکت و برنامه نویسی سوکت

. سوکت یکی از اساسی ترین تکنولوژی های شبکه کامپیوتری است•(.الیه انتقال)بین نرم افزار و سخت افزار شبکه رابطیک •محلی یا )از دیگر برنامه های/بهدریافت کنند /پیام ارسالبرنامه ها از طریق سوکت می توانند •

(دورهای مرورگر های وب، برنامه های پیام رسانی و سیستم)خیلی از نرم افزارهای محبوب شبکه •

.هستندوابسته به سوکت ( اشتراک فایل نقطه به نقطه

4

Page 5: Socket Programming in C++

دو مدل اساسی از سوکت ها

Stream Sockets (SOCK_STREAM)

مبنی بر پروتکلTCP

ارتباطات دو طرفه ی قابل اعتمادبرای ارتباط باید اتصال برقرار باشدترتیب تضمین می شود

Datagram Sockets(SOCK_DGRAM)

منبی بر پروتکلUDP

اتصال غیر قابل اعتمادترتیب تضمین نیستارتباط بدون اتصال

5

App

socket3 2 1

Dest.

App

socket3 2 1

D1

D3

D2

Page 6: Socket Programming in C++

ایجاد کردن یک سوکت–socketتابع

• int s = socket(int domain, int type, int protocol);

•S : توصیف گر سوکت، از نوعint(مانند کار با فایل)•Domain : دامنه باید با پارامترPF_INETمقداردهی شود.•Type : نوع ارتباط، ثابتSOCK_STREAM یاSOCK_DGRAM

•Protocol :پروتکل را صفر قرار دهید تا براساس نوع ارتباط انتخاب شود..فیلد اول و سوم در برنامه نویسی تحت شبکه اینترنت همیشه ثابت اند•:مثال•

• int sockfd;

• sockfd = socket (PF_INET, SOCK_STREAM, 0);

6

Page 7: Socket Programming in C++

ساختارهای سوکت

.اطالعات آدرس انواع زیادی از سوکت ها نگه داری میکند: sockaddrساختار •struct sockaddr

{

unsigned shot sa_family; // address family, AF_XXX

char sa_data[14]; //14 bytes of protocol address

};

.یک ساختار همتا قبلی که کار با المان های آدرس سوکت را ساده می کندsockaddr_in:ساختار•struct sockaddr_in

{

short int sin_family; //Address family

unsigned short int sin_port; // Port number

struct in_addr sin_addr; //Internet address

unsigned char sin_zero[8]; //Same size as struct sockaddr

};

7

Page 8: Socket Programming in C++

ساختارهای سوکت

تعریف شده که بصورت زیر استin_addrدر تعریف ساختار دوم یک ساختار دیگر به نام •/* Internet IP address */

struct in_addr

{

unsigned long s_addr;

};

Network Byte Orderباید به صورت sin_adrوsin_port:نکته•

.باشند( بایت با ارزش در همان ابتدا باقی می ماند)Big Endianیا همان•

8

Page 9: Socket Programming in C++

روش های ذخیره سازی داده ها

•Network Byte Order (یا )بایت پر اهمیت در ابتداBig Endian

•Host Byte Order(یا )بایت کم اهمیت در ابتداLittle Endian

.توافق شده استBEترتیب بایتها بصورت TCP/IPدر پروتکل •.، ترتیب بایت های ارسالی بهم خواهد خوردLEبرنامه شما روی ماشینی با ساختار •:نمونه•

• 2500$ (BE) -> 0025$ (LE)

9

Page 10: Socket Programming in C++

روش های ذخیره سازی داده ها

:تبدیل داده های محلی•

• htons() : BE به حالتدو بایتی تابع تبدیل کلمات• htonl() : BE به حالتچهار بایتی تابع تبدیل کلمات• ntohs() : به حالت فعلی ماشین BE تابع تبدیل کلمات دوبایتی از• ntohl() : حالت فعلی ماشین به BE تابع تبدیل کلمات چهاربایتی از

10

Page 11: Socket Programming in C++

و طریقه کار با آنهاIPآدرس های

• int inet_aton(const char *cp, struct in_addr *inp);

.میگیرد و آن را به یک ساختار آدرس تبدیل می کندIPرشته برای آدرس •.نداریدBEنیازی برای تبدیل به •

struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(MYPORT);

inet_aton(“10.0.0.5”,&(my_addr.sin_addr));

memset(&(my_addr.sin_zero),'\0',8);

مقدار بازگشتی برای موفقیت عددی غیر صفر، و صفر برای شکست•

11

Page 12: Socket Programming in C++

و طریقه کار با آنهاIPآدرس های

inet_ntoaتابع : به رشتهIPبرای تبدیل •

• printf("%s",inet_ntoa(ina.sin_addr));

12

Page 13: Socket Programming in C++

روی چه پرتی هستم؟–bindتابع

برای پیوند دادن یک پورت با سوکت•

• int status = bind(sockid, &addrport, size);

•sockfd : قبالً با استفاده از تابع که همان مشخصه سوکتیsocket کرده ایدباز.•my_addr : یک ساختار که خانواده سوکت، آدرس پورت و آدرسIP محلی را در خود ماشین

.دارد

•addr_len : ساختارطولmy_addr حسب بایت بر.به معنی بروز خطا است1-بازگشتی مقدار •

13

Page 14: Socket Programming in C++

روی چه پرتی هستم؟–bindتابع

یک نمونه کامل تا این مرحله•Int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(PF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

my_addr.sin_addr.s_addr = inet_addr ("172.28.44.57");

memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

بررسی خطاهای احتمالی //

14

Page 15: Socket Programming in C++

!سالم–connectتابع

برای اتصال به یک سرویس دهنده•

• int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

•sockfd : مشخصه سوکتی است که با فراخوانی تابعsocket آمده استبدست.•serv_addr : ساختاری از نوعsockaddr شداست که قبال معرفی.•addrlen : مقدار. بایتحسب بر اندازه ساختار قبلیsizeof(struct sockaddr) قرار دهید.. بودخواهد -1برگشتی این تابع مقدار TCPدر صورت عدم موفقیت در برقراری یک ارتباط •.چون سیستم عامل پورت را انتخاب می کند. نیستbindنیازی به تابع •

15

Page 16: Socket Programming in C++

!سالم–connectتابع

مثال•#define DEST_IP "172.28.44.57"

#define DEST_PORT 5000

main(){

Int sockfd;

struct sockaddr_in dest_addr; // will hold the destination addr

Sockfd = socket(PF_INET, SOCK_STREAM, 0);

dest_addr.sin_family = AF_INET; // host byte order

dest_addr.sin_port = htons(DEST_PORT); // network byte order

dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);

memset(&(dest_addr.sin_zero), '\0', 8); // zero the rest of the struct

connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));

بررسی خطاهای احتمالی //

16

Page 17: Socket Programming in C++

!لطفا با من تماس بگیرید–listenتابع

انتظار سرویس دهنده برای اتصال های وارده از طرف کالینت ها•• int listen(int sockfd, int backlog);

•sockfd : ایجاد کرده ایدآن را همان مشخصه سوکت است که در ابتدا.•backlog :حداکثر تعداد ارتباطات معلّق و به صف شدۀ منتظر..خواهد بود-1در صورت بروز خطا مقدار برگشتی این تابع •.داریدنیاز bindفرخوانی کنید به تابع این تابع را قبل از اینکه •

• socket)(• bind)(• listen)(• accept)(

17

Page 18: Socket Programming in C++

!سپاس از تماس شما–acceptتابع

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

.رسیدگی نمایید

• int accept(int sockfd, void *addr, int *addrlen);

•sockfd : مشخصه سوکت است که در ابتدا با تابعsocket بدست آمده است.•addr :اطالعات درباره اتصال پذیرفته شده درaddr ذخیره میشود که یک اشاره گر به

.استsockaddr_inساختار •addrlen : طول ساختارaddrبر حسب بایت

18

Page 19: Socket Programming in C++

!سپاس از تماس شما–acceptتابع

:مثال#define MYPORT 3490 // the port users will be connecting to#define BACKLOG 10 // pending connections queue will hold

main(){int sockfd, new_fd; // listen on sock_fd, new connection on new_fdstruct sockaddr_in my_addr; // my address informationstruct sockaddr_in their_addr; // connector's address informationint sin_size;sockfd = socket(PF_INET, SOCK_STREAM, 0);my_addr.sin_family = AF_INET; // host byte ordermy_addr.sin_port = htons(MYPORT); // short, network byte ordermy_addr.sin_addr.s_addr = INADDR_ANY; // auto-fill with my IPmemset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

19

Page 20: Socket Programming in C++

!سپاس از تماس شما–acceptتابع

:ادامهbind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

listen(sockfd, BACKLOG);

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);

acceptکه مشخصه آن توسط تابع سوکت جدیدی برای ارسال یا دریافت داده ها بایستی از •.برمیگردد ، استفاده کنید

20

Page 21: Socket Programming in C++

انتقال داده–recvو sendتوابع

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

• int send(int sockfd, const void *msg, int len, int flags);• int recv(int sockfd, void *buf, int len, unsigned int flags);

•sockfd : مشخصه سوکتی که از تابعaccept بدست آمده است.•msg : این پارامتر در تایعsend که داده های ارسالی از آنجا ( مثل آرایه یا ساختار)در حافظه محلی

.گرفته و ارسال می شوندقرار استخراج شده و درون فیلد داده •len : بایتارسالی یا دریافتی بر حسب داده های طول.•flags :برای پرهیز از پیچیدگی فقط در آن صفر بگذارید.•buf : این پارامتر در تابعrecv آدرس محلی در حافظه است که داده های دریافتی در آنجا قرار گرفته

.و به برنامه باز گردانده می شود

21

Page 22: Socket Programming in C++

بای بای–closeتابع

این closeوقتی کار انتقال داده تمام شد و میخواهید ارتباط را قطع کنید، میتوانید با تابع •. کار را انجام دهید

• close(int sockfd);

•sockfd :مشخصه سوکت مورد نظر .اهد میشود دیگر برای ارسال و دریافت قابل استفاده نخوبسته closeارتباطی که توسط تابع •

.بود

22

Page 23: Socket Programming in C++

(TCPمبتنی بر)توابع مورد استفاده در برنامۀ سرویس دهنده

برای ایجاد سوکتsocketتابع •برای تنظیم کردن پورت روی سوکتbindتابع •برای گوش دادن به تقاضای مشتری برای برقراری ارتباطlistenتابع •برای پذیرفتن تقاضای مشتری برای برقراری ارتباطacceptتابع •برای انتقال دادهrecvو sendتوابع •برای بستن ارتباطcloseتابع •

23

Page 24: Socket Programming in C++

(TCPمبتنی بر )توابع مورد استفاده در برنامۀ مشتری

برای ایجاد سوکتsocketتابع •(انتظار تا پذیرفته شدن)برای فرستادن تقاضای برقراری ارتباط connectتابع •برای انتقال دادهrecvو sendتوابع •برای بستن ارتباطcloseتابع •

24

Page 25: Socket Programming in C++

TCPخالصه توابع مورد استفاده در

25

Page 26: Socket Programming in C++

UDPخالصه توابع مورد استفاده در

26

Page 27: Socket Programming in C++

منابع

27

•Unix Network Programming(Richard Stevens)•TCP/IP Illustrated(Stevens and Gary R. Wright)(مهندس احسان ملکیان)اصول مهندسی اینترنت •