Сетевые крестики нолики
Рефераты >> Коммуникации и связь >> Сетевые крестики нолики

Содержание

1. Задание. 3

2. Используемые сетевые сообщения. 4

3. Основные функции программы. 5

4. Процессы. 7

Диаграммы: 8

5. Текст программы. 100

1. Задание.

Разработать приложения клиент и сервер для сетевой игры «Крестики нолики»с использованием UDP протокола. Клиент «активный», сервер «пассивный».

2. Используемые сетевые сообщения.

Каждый отправляемый программой пакет имеет идентификатор вида пакета и само сообщение.

В программе использованы следующие 5 видов пакетов:

1) пакет «информация о карте». В его сообщении содержатся карта игры. При ходе одной стороны передается новая карта и номер хода /Info (i)/.

2) пакет «подтверждение хода». Сообщение содержит те же данные, что и в 1). отправляется при изменении одной координаты /Info (r)/.

3) пакет «установка и проверка соединения» Установка соединения с сервером и его проверка /Connect/.

4) пакет «ожидание, соединение и проверка». Ожидание соединения, при соединении периодическая проверка соединения /Ping (r)/.

5) пакет «запрос на получение информации от сервера» /Info (r)/.

Пакеты 1). – 5). имеют следующий формат.

union packd {

char buff[63]; // buffer

struct pack p; // данные

};

где

struct pack{

char action, step; // тип пакета, номер шага

char matr[4][4]; // карта

} ar;

3. Основные функции программы.

· void initme(){;

//Инициализация клиентского и серверного сокетов.

· void ServerStop(HWND hWnd)

//Освобождение ресурсов, завершение нитей, закрытие сокетов.

· bool clientconnect(HWND hWnd)

//Создание нити соединения клиента с сервером.

· void startserv(HWND hWnd)

//Запуск сервера. Запуск нити для работы с клиентом, проверка наличия связи с клиентом.

· void putplus(HWND hWnd, char flag,char i, char j)

//Принятие хода клиента, отправка карты серверу (или клиенту).

//Параметр flag имеет следующие значения:

// PLUS – крестик, ZERO – нолик.

// (i,j) – координаты хода.

· DWORD WINAPI ThreadAction_cl(LPVOID param)

· DWORD WINAPI ThreadAction_serv(LPVOID param)

//нити клиента и сервера. Проверяют наличие друг друга (клиента и сервера) При получении информации о ходе – обновляется карта и посылается подтверждение.

· DWORD WINAPI ThreadAction_put(LPVOID param)

//Нить для отправки информации о ходе сопернику. Производит периодическую отправку информации о ходе до получения подтверждения о ходе.

· void drawme(HWND hWnd)

//перерисовка карты в случае хода или получения информации.

· CHAR * get_error_text(int code)

· void err(char * pl)

// выдача сообщений об ошибках.

· int testnew(pack st, pack nd)

// проверка целостности информации из пакета (сравнение прошлой и текущей карт при получении информации. При отличии карты на одну координату происходит отправка подтверждения и обновление карты игрока).

4. Процессы.

В процессе работы периодически проверяется наличие связи между клиентом и сервером (пакеты типа 3 и 4). При ходе игрока отправляется информация о ходе до получения подтверждения. При отсутствии подтверждения (в рамках определенного времени – timeout на подтверждение) отправка информации повторяется периодически до получения подтверждения. Случайная потеря или повреждение пакета не приведет к некорректности работы т.к. осуществляется проверка целостности данных.

Программа завершает работу по команде пользователя или при timeout-е.

Диаграммы:

5. Текст программы.

#include "stdafx.h"

#include "resource.h"

#include <winsock2.h>

#include <stdlib.h>

#include <stdio.h>

#define MAX_LOADSTRING 100

#define WSA_ACCEPT (WM_USER + 1)

#define WSA_NETEVENT (WM_USER + 2)

#define VALIDSOCK(s) ((s)>=0)

#define DERROR GetLastError()

#define CLOSEROUTINE(s) closesocket(s)

#define TRETCODE WORD

/*

* Client interaction routine data

*/

typedef struct _THREAD_DATA {

SOCKET client;

struct sockaddr_in address;

} THREAD_DATA, * PTHREAD_DATA;

struct cs {

SOCKET client,server;

} mcs;

struct pack{

char action, step;

char matr[4][4];

} ar;

union packd {

char buff[63];

struct pack p;

};

int tr = 0, trd = 0;

/*

* socket adrress type converter routine

*/

#define SACONV(a) (struct sockaddr *)a

void err(char * pl);

void drawme(HWND hWnd);

void ServerStop(HWND hWnd);

HINSTANCE hInst; // current instance

TCHAR szTitle[MAX_LOADSTRING]; // The title bar text

TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

bool iamserv = false,started = false, iamclient = false, selected = false, sstep = false, cstep = true;

SOCKET s,s_cl=0,client=0; /* Client connection socket */;

SOCKADDR_IN dest_sin;

struct sockaddr_in caddr; /* Local socket bind address */

struct sockaddr_in saddr; /* Remote (target) address */

struct sockaddr_in local_cl; /* Local client address */

HANDLE thread,thread_cl,thread_draw, thread_put;

#define SERV_PORT 55555

#define CLNT_PORT 55556

#define PLUS 1

#define ZERO 2

#define SIDE 40

struct timeval tv;

HANDLE finished, finished_cl, finished_draw,finished_put;

CHAR * get_error_text(int code) {

switch (code) {

case (WSANOTINITIALISED): return "Winsock was not initialized";

case (WSAENETDOWN): return "Network subsystem failed";

case (WSAEADDRINUSE): return "local addres already used";

case (WSAEINTR): return "call cancelled";

case (WSAEINPROGRESS): return "operation in progress";

case (WSAEALREADY): return "already connecting";

case (WSAEADDRNOTAVAIL): return "local address not available";

case (WSAEAFNOSUPPORT): return "address family not supported";

case (WSAECONNREFUSED): return "connection refused (port closed)";

case (WSAEFAULT): return "memory access violation";


Страница: