درس 12 : نوشتن بازیهای تحت شبکه با SDL_net قسمت دوم

حال قدری عمیق تر به SDL_net نگاه می کنیم .

 

شبیه SDL , SDL_net هم باید قبل از استفاده اماده شود بوسیله تابع SDLNet_Init :

int SDLNet_Init(void);

شما در صورت درست آماده شدن مقدار غیر صفر بر می گرداند.

 

و اما ساختار IPaddress :

typedef struct {

Uint32 host; /* 32-bit IPv4 host address */

Uint16 port; /* 16-bit protocol port */

} IPaddress;

Host به عنوان یک Uint32 تعریف شده و نگه دارنده 4 بایت شناسه یک کامپیوتر است.البته یک مقدار ثابتهایی هم براش در نظر گرفته شده است مثل :

 INADDR_ANY(0) و INADDR_NONE(0xFFFFFFFF)

شما از INADDR_ANY برای سوکت های سرور استفاده می کنید و از INADDRE_NONE هم برای موقعی که نمی خواهید در شبکه دیده شوید.

 

Port هم به عنوان یک Uint16 تعریف شده است که نمایند مدخل ورود و خروج اطلاعات بر روی کامپیوتر است شبیه یک در در نظر بگیرید که روش یه شماره دارد وشماره چون 2 بایتی پس از صفر می تواند باشد تا 65535.

 

حال دو تابعی که با IP ادرس کار می کنند را به شما می گم

اولیش SDLNet_ResolveHost است شما از این تابع برای پیدا کردن IP سرور ی که می خواهید به ان وصل شوید استفاده می کنید مثلا اسمش و دارید gamedev.net می خواهید IP اش را بدانید . یا می توان با این تابع یک سرور بسازیم

int SDLNet_ResolveHost(IPaddress *address, char *host, Uint16 port);

این تابع یک int بر می گرداند در صورت پیش امدن اشکال مقدار صفر بر می گرداند پارامتر اول یک ساختار IPaddress می گیرد و ان را پر می کند پارامتر بعدی یک رشته بع عنوان اسم می گیرد اگر Lan بود مثلا 192.168.0.1 یا اینترنت phyton.org به هر معرفی کننده جایی که می خوایم به ان وصل شویم و پارامتر اخر هم مشخص کننده مدخلی است که سرور برای ما باز گذاشته است و خود داره روش Listen می کند.

وقتی بخواهید یک سوکت سرور بنویسید شما باید host را NULL قرار دهید معادل قرار دادن هاست به INADDR_ANY است

اگر شما IP ماشینی را دارید و اسمش را بخواهید کافی است IP ان را به یک اشاره گر به ساختار IPaddress بدهید وسپس از این تابع استفاده کنید.

char * SDLNet_ResolveIP(IPaddress *ip);

اگر host را به INADDR_ANY ست کنید اسم کامپیوتر خود را بر می گرداند در غیر اینصورت می گردد و اسم را پیدا می کند.

یک sample از اینچیزای که گفتم تا اینجا  (اسم کامپیوتر من Anothername !):

 

#include "sdl/sdl.h"

#include "sdl/sdl_net.h"

#include

int main(int argc,char* argv[])

{

            if(SDL_Init(SDL_INIT_EVERYTHING)==-1)

            {

            return(0);

            }

            atexit(SDL_Quit);

            if(SDLNet_Init())

            {

            return(0);

            }

            atexit(SDLNet_Quit);

            IPaddress ip;

            SDLNet_ResolveHost(&ip,NULL,16);

            fprintf(stdout,"Local Host: %s ",SDLNet_ResolveIP(&ip));

            SDLNet_ResolveHost(&ip,"www.gamedev.net",16);

            fprintf(stdout,"Remote Host: %s ",SDLNet_ResolveIP(&ip));

            return(0);

}

 

 

TCPScocket:

یک TCPsocket یک اشاره گر است به ساختار _TCPsocket :

typedef struct _TCPsocket *TCPsocket;

تعریف ساختار _TCPsocket از برنامه نویس ها مخفی شده است چون نیازی به دانستن کارش نیست اگرم خواستین می توانید source code , SDL_net را از libsdl.org/projects دانلود کنید و ببینید.

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

TCPsocket SDLNet_TCP_Open(IPaddress *ip);

این تابع یک اشاره گر به IP ادرس می گیرد و یک TCPSocket می سازد اگر NULL برگرداند یعنی اشتباهی رخ داده است. اگر ip.host به INADDR_ANY یا INADDR_NONE تنظیم شده باشد یک سوکت سرور می سازد و اگر نه تلاش می کند که به ان سرور وصل شود.

 

معمولا اگر یک سوکت باز کنید بعدا باید ببندینش تابع انجام دادنش هم :

void SDLNet_TCP_Close(TCPsocket sock);

حالا چند کلمه در مورد فرق بین سوکت های سرور و سوکت های کلاینت فرض کنید مثلا بخواهید یک برنامه چت بنویسید که می تونید انتخاب کنید برنامه تون سرور باشد یا به یک سرور وصل شود برای قسمت سرور شما لازمه یک سوکت سرور داشته باشید به تعداد سوکت های کلاینت که به سرور شما وصل شده اند و در نقش یک کلاینت شما فقط نیاز به یک سوکت کلاینت دارید برای ارتباط با سرور, سوکت سرور در حال listen کردن کامپیوترهای دیگه هست که به session اضافه می وند و شما یک سوکت سرور را برای send و receive اطلاعات لازم نداریدوقتی یک سوکت سرور اطلاعاتی اماده خوندن دارد شما از تابع SDLNet_TCP_Accept استفاده می کنید.

TCPsocket SDLNet_TCP_Accept(TCPsocket server);

این تابع یک سوکت TCP می گیرد و حتما هم باید از نوع سرور باشد و یک TCPSocket بر می گرداند که مقدار برگشتی یک کانکشن است به کامپیوتر مقصد که از SDLNet_TCP_Open استفاده کرده بودیم که با ان ارتباط بر قرار کنیم.

بعد از اینکه این کار را برای اتصال به یک ماشین جدید کردیم می توانیم IP کامپیوتر را به وسیله تابع SDLNet_GetPeerAddress بدست اوریم.

IPaddress * SDLNet_TCP_GetPeerAddress(TCPsocket sock);

و تابعی دیگر که برای ارصال اطلاعات از ان استفاده می شود SDLNET_TCP_SEND است.

int SDLNet_TCP_Send(TCPsocket sock, void *data, int len);

این تابع یک TCPsocket غیر سرور می گیرد یک Void * هم که اشاره دارد به دادهای ما و طول داده ومقدار داده ای که فرستاده شد را بر می گرداند که اگر برابر باlen نباشد یعنی خطایی رخ داده است.

تابعی هم برای  دریافت اطلاعات هست :

int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen);

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

باور بکنید یا نه SDL_net با 8 تابع و 2 ساختار می تواند تقریبا هر نوع برنامه شبکه ای را بنویسد.

 

SDL_net توابعی برای UDP هم دارد که من در اینجا توضیح نمی دم چون فکر می کنم TCP همه کارهای شما را می تواند راه بیاندازد.

 

یک ساختار SDLNET_SocketSet هم هست برای نگه داری ارایه از سوکت ها اول باید با دستور SDLNET_AllocSocketSet اماده شود.

Net_SocketSet SDLNet_AllocSocketSet(int maxsockets);

برای add کردن سوکت :

int SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);

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

int SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock);

و دستور :

int SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout);

 

Resource Focus On SDL

ISBN :  1592000304 

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد