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

استفاده از UDP :

بازی ها از پرتکل UDP استفاده می کنند چون UDP از TCP سریعتر است و

البته هزینه این سرعت را هم باید پرداخت و این هزینه نامطمئن بودن این پروتکل است

 همانطور که قبلا توضیح دادم.

 

قسمت سرور :

1.اماده کردن کتابخانه SDL_net

2.باز کردن یک سوکت بر روی یک پورت مشخص

3.تخصیص دادن حافظه برای بسته های اطلاعات

4.منتظر ماندن برای بسته های ارسالی از کابران

5.انجام دادن  کاری با بسته ها

6.ازاد کردن حافظه و خروج از برنامه.

 

قسمت کلاینت :

1.اماده سازی کتابخانه SDL_net .

2.باز کردن یک سوکت روی یک پورت قابل استفاده به صورت شانسی .

3.تایین کردن آدرس سرور

4.تخصیص حافظه برای بسته ها

5.پر کردن و فرستادن بسته ها

6.آزاد سازی حافظه و خروج از برنامه

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#include "SDL_net.h"

 

int main(int argc, char **argv)

{

            UDPsocket sd;       /* Socket descriptor */

            UDPpacket *p;       /* Pointer to packet memory */

            int quit;

 

            /* Initialize SDL_net */

            if (SDLNet_Init() < 0)

            {

                        fprintf(stderr, "SDLNet_Init: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

در اینجا sd همان سوکت سرورمان است و p اشاره گری است

 به بسته حاوی اطلاعات در حافظه است .

            /* Open a socket */

            if (!(sd = SDLNet_UDP_Open(2000)))

            {

                        fprintf(stderr, "SDLNet_UDP_Open: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

در اینجا هم یک سوکت بر روی پورت 2000 باز می کنیم.

            /* Make space for the packet */

            if (!(p = SDLNet_AllocPacket(512)))

            {

                        fprintf(stderr, "SDLNet_AllocPacket: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

در اینجا هم 512 بایت حافظه را به بسته های ارصالی تخصیص می دهیم.

            /* Main loop */

            quit = 0;

            while (!quit)

            {

                        /* Wait a packet. UDP_Recv returns != 0 if a packet is coming */

                        if (SDLNet_UDP_Recv(sd, p))

                        {

                                    printf("UDP Packet incoming ");

                                    printf(" Chan:    %d ", p->channel);

                                    printf(" Data:    %s ", (char *)p->data);

                                    printf(" Len:     %d ", p->len);

                                    printf(" Maxlen:  %d ", p->maxlen);

                                    printf(" Status:  %d ", p->status);

                                    printf(" Address: %x %x ", p->address.host, p->address.port);

 

                                    /* Quit if packet contains "quit" */

                                    if (!strcmp((char *)p->data, "quit"))

                                                quit = 1;

                        }                     

            }

 

            /* Clean and exit */

            SDLNet_FreePacket(p);

            SDLNet_Quit();

            return EXIT_SUCCESS;

}

در اینجا هم در صورت دریافت هرگونه بسته اطلاعاتی

 تابع SDLNet_UDP_Recv مقدار غیر صفر بر می گرداند.

و p هم که اشاره گری از نوع UDPpacket است.

ساختار UDPpacket طبق شکل مقابل است.

typedef struct {

    int channel;          /* The src/dst channel of the packet */

    Uint8 *data;          /* The packet data */

    int len;              /* The length of the packet data */

    int maxlen;           /* The size of the data buffer */

    int status;           /* packet status after sending */

    IPaddress address;    /* The source/dest address of an

                                   incoming/outgoing packet */

} UDPpacket;

و اما برای سمت کلاینت :

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#include "SDL_net.h"

 

int main(int argc, char **argv)

{

            UDPsocket sd;

            IPaddress srvadd;

            UDPpacket *p;

            int quit;

 

            /* Check for parameters */

            if (argc < 3)

            {

                        fprintf(stderr, "Usage: %s host port ", argv[0]);

                        exit(EXIT_FAILURE);

            }

           

            /* Initialize SDL_net */

            if (SDLNet_Init() < 0)

            {

                        fprintf(stderr, "SDLNet_Init: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

در اینجا نیز sd سوکت ما و srvadd ادرس سرور و p اشاره گری از نوع UDPpacket است

و در اول کار چک می کند که حتما دو ارگومان به عنوان ورودی از خط فرمان بگیرد.

            /* Open a socket on random port */

            if (!(sd = SDLNet_UDP_Open(0)))

            {

                        fprintf(stderr, "SDLNet_UDP_Open: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

یک سوکت بر روی یک پورت شانسی ایجاد می کند.

            /* Resolve server name  */

            if (SDLNet_ResolveHost(&srvadd, argv[1], atoi(argv[2])))

            {

                        fprintf(stderr, "SDLNet_ResolveHost(%s %d): %s ", argv[1], atoi(argv[2]), SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

آدرس سرور را در srvadd می ریزد.

 

            /* Allocate memory for the packet */

            if (!(p = SDLNet_AllocPacket(512)))

            {

                        fprintf(stderr, "SDLNet_AllocPacket: %s ", SDLNet_GetError());

                        exit(EXIT_FAILURE);

            }

 

            /* Main loop */

            quit = 0;

            while (!quit)

            {

                        printf("Fill the buffer >");

                        scanf("%s", (char *)p->data);

                       

                        p->address.host = srvadd.host;    /* Set the destination host */

                        p->address.port = srvadd.port;    /* And destination host */

 

                        p->len = strlen((char *)p->data) + 1;

                        SDLNet_UDP_Send(sd, -1, p); /* This sets the p->channel */

 

                        /* Quit if packet contains "quit" */

                        if (!strcmp((char *)p->data, "quit"))

                                    quit = 1;

            }

 

            SDLNet_FreePacket(p);

            SDLNet_Quit();

 

            return EXIT_SUCCESS;

}

سپس کار تخصیص فضا را انجام می دهد و منتظر ورودی کاربر می شود و اطلاعات را به سمت سرور می فرستد.

کلاینت :

 

 شمخخ

سرور :

شسی

نظرات 2 + ارسال نظر
erors شنبه 14 مرداد‌ماه سال 1385 ساعت 10:49 ق.ظ

لطف کنید میلتون رو چک کنید

حمید یکشنبه 15 مرداد‌ماه سال 1385 ساعت 10:53 ق.ظ http://gamedot.blogfa.com/

سلام دوست عزیز...
من طبق درخواست شما لینک بلاگتان را در وبلاگم قرار دادم. خوشحال میشم اگر شما هم لینک وبلاگم را با عنوان بازیهای رایانه ای بگذارید.

موفق باشی

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