Сетевые крестики ноликиРефераты >> Коммуникации и связь >> Сетевые крестики нолики
Содержание
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";