Создание сетевой игры
Создание сетевой игры "Кости". Протоколы, используемые в сетевой игре: IPX предоставляет возможность программам обмениваться пакетами данных без подтверждения; протоколы SPX и NETBIOS сделаны на базе IPX и поэтому требуют дополнительных ресурсов.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.05.2008 |
Размер файла | 67,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
else
strcpy(OurAddress.snb_name,NETBIOS_CLIENT_NAME);
if (bind(NetBiosSocket, (LPSOCKADDR)&OurAddress, sizeof(sockaddr_nb)) == SOCKET_ERROR)
{
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
continue;
}
else break;
}
if(Lana==1000)
{
Application->MessageBox("Не определена Lana","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
if(IsServer)
{
if(listen(NetBiosSocket, 1) == SOCKET_ERROR )
{
Application->MessageBox("Listen Error","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
Application->Terminate();
}
rc = WSAAsyncSelect(NetBiosSocket, Handle, WSA_ACCEPT, FD_ACCEPT);
if (rc != 0)
{
Application->MessageBox("Ошибка WSAAsyncSelect","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
Application->Terminate();
}
}
else
{
memset(&CallAddress, 0, sizeof(CallAddress));
CallAddress.snb_family = AF_NETBIOS;
CallAddress.snb_type = NETBIOS_UNIQUE_NAME;
strcpy(CallAddress.snb_name,NETBIOS_SERVER_NAME);
if(connect(NetBiosSocket , (PSOCKADDR )&CallAddress, sizeof(CallAddress)) < 0)
{
Application->MessageBox("Connect Error","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
Application->Terminate();
}
rc = WSAAsyncSelect(NetBiosSocket, Handle, WSA_NETEVENT, FD_READ);
if (rc != 0)
{
Application->MessageBox("Ошибка WSAAsyncSelect","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
Application->Terminate();
}
}
WindowProc = NetBiosWndProc;
}
//-------------------Прием и accept---------------------------------------------
void __fastcall TMainForm::NetBiosWndProc(Messages::TMessage &Message)
{
int rc;
char Buf[80];
if (Message.Msg == WSA_NETEVENT)
{
if (Message.LParam == FD_READ)
{
rc = recv((SOCKET)Message.WParam, Buf, sizeof(Buf)-1, 0);
if (rc == SOCKET_ERROR)
{
rc = WSAGetLastError();
Application->MessageBox("Ошибка recv NetBios","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
Application->Terminate();
}
if (rc >= 1)
{
if(IsVisitApplicationBox) return;
Priem(CharToMas(Buf));
}
}
}
else if(Message.Msg == WSA_ACCEPT)
{
if(Message.LParam == FD_ACCEPT)
{
int sizeCallAddress = sizeof(CallAddress);
NetBiosSocket = accept (NetBiosSocket, (LPSOCKADDR )&CallAddress, (int FAR *)&sizeCallAddress);
if(NetBiosSocket == INVALID_SOCKET)
{
Application->MessageBox("Ошибка Accept","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
char *strPered=DannieToChar(0,KolKub,MaxOch);
NetBiosSend(strPered);
InterfaceBeginNewGame();
ChangeInterfacePerehodHoda(1);
rc = WSAAsyncSelect(NetBiosSocket, Handle, WSA_NETEVENT, FD_READ);
if (rc != 0)
{
Application->MessageBox("Ошибка WSAAsyncSelect","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
Application->Terminate();
}
}
}
WndProc(Message);
}
//-------------------отправка---------------------------------------------------
void __fastcall TMainForm::NetBiosSend(char *Buf)
{
int rc;
rc = send(NetBiosSocket, Buf, strlen(Buf)+1, 0);
if (rc == SOCKET_ERROR)
{
rc = WSAGetLastError();
Application->MessageBox("Ошибка sendto NetBios","Ошибка",MB_OK+MB_ICONHAND);
closesocket(NetBiosSocket);
NetBiosSocket = INVALID_SOCKET;
Application->Terminate();
}
}
//----------------разрыв-------------------------------------------------------
void __fastcall TMainForm::NetBiosCloseConnection(void)
{
closesocket(NetBiosSocket);
WSACleanup();
}
//---------------------------------------------------------------------------
Pipe.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <StrUtils.hpp>
#include "Pipe.h"
#include "Main.h"
#include "Podkluch.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
HANDLE PipeReceiveHandle, PipeSendHandle;
extern bool IsServer;
extern AnsiString ServerHostName;
extern int KolKub;
extern int MaxOch;
//-----------------------подключение--------------------------------------------
void __fastcall TMainForm::PipeConnect(void)
{
if(IsServer)
{
PipeReceiveHandle = CreateNamedPipe("\\\\.\\pipe\\pipe_s", PIPE_ACCESS_INBOUND,
PIPE_TYPE_BYTE|PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES,
1000, 1000, 5000, NULL);
if (PipeReceiveHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при создании pipe на сервере","Ошибка",MB_OK+MB_ICONHAND);
TimerPipe->Enabled = false;
Application->Terminate();
}
TimerPipe->Enabled = true;
}
else
{
PipeReceiveHandle = CreateNamedPipe("\\\\.\\pipe\\pipe_c", PIPE_ACCESS_INBOUND,
PIPE_TYPE_BYTE|PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES,
1000, 1000, 5000, NULL);
if (PipeReceiveHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при создании pipe на клиенте","Ошибка",MB_OK+MB_ICONHAND);
TimerPipe->Enabled = false;
Application->Terminate();
}
TimerPipe->Enabled = true;
char Buf[100];
sprintf(Buf, "\\\\%s\\pipe\\pipe_s", ServerHostName.c_str());
PipeSendHandle = CreateFile(Buf, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (PipeSendHandle == INVALID_HANDLE_VALUE)
{
int rc;
rc=GetLastError(); //5 51
Application->MessageBox("Ошибка при подключении к pipe на сервере","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
char CompName[50];
unsigned long cnl = 50;
GetComputerName(CompName, &cnl);
int i=StrLen(CompName);
if(i>=50)
{
CompName[49]='\0';
}
unsigned long cbWritten;
char BufExchange[100];
strcpy(BufExchange,"connect;");
strcat(BufExchange,CompName);
WriteFile(PipeSendHandle, BufExchange, i+9, &cbWritten, NULL);
}
}
//---------------прием и accept--------------------------------------
void __fastcall TMainForm::TimerPipeTimer(TObject *Sender)
{
int Rc;
DWORD cbRead;
DWORD cbWritten;
char Buf[100];
ConnectNamedPipe(PipeReceiveHandle, NULL);
Rc = GetLastError();
if (Rc == ERROR_PIPE_CONNECTED) //535
{
if (ReadFile(PipeReceiveHandle, Buf, sizeof(Buf)-1, &cbRead, NULL))
{
if(LeftStr(AnsiString(Buf),7)=="connect")
{
char *Buftmp;
char BufConnect[150];
Buftmp=AnsiStrScan(Buf,';');
Buftmp++;
sprintf(BufConnect, "\\\\%s\\pipe\\pipe_c", Buftmp);
PipeSendHandle = CreateFile(BufConnect, GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (PipeSendHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при подключении к pipe на клиенте","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
char *strPered=DannieToChar(0,KolKub,MaxOch);
PipeSend(strPered);
InterfaceBeginNewGame();
ChangeInterfacePerehodHoda(1);
}
else
{
if(IsVisitApplicationBox) return;
Priem(CharToMas(Buf));
}
}
}
}
//-----------------отправка-----------------------------------------------------
void __fastcall TMainForm::PipeSend (char* Buf)
{
unsigned long cbWritten=0;
WriteFile(PipeSendHandle, Buf, strlen(Buf)+1, &cbWritten,NULL);
}
//-------------------разрыв соединения-----------------------------------------
void __fastcall TMainForm::PipeCloseConnection(void)
{
CloseHandle(PipeSendHandle);
CloseHandle(PipeReceiveHandle);
TimerPipe->Enabled = false;
}
Mailslot.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MailSlot.h"
#include "Podkluch.h"
#include "Main.h"
//------------------------------------------------------------------------------
#pragma package(smart_init)
HANDLE ReceiveMailslotHandle, SendMailslotHandle;
int HisPrevNomMessage=0;
int MyCurrNomMessage=0;
extern bool IsServer;
extern AnsiString ServerHostName;
extern int KolKub;
extern int MaxOch;
//-----------------------подключение--------------------------------------------
void __fastcall TMainForm::MailSlotConnect(void)
{
if(IsServer)
{
ReceiveMailslotHandle = CreateMailslot("\\\\.\\mailslot\\msserver", 0, MAILSLOT_WAIT_FOREVER, NULL);
if (ReceiveMailslotHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при создании mailslot","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
TimerMailSlot->Enabled = true;
}
else
{
ReceiveMailslotHandle = CreateMailslot("\\\\.\\mailslot\\msclient", 0, MAILSLOT_WAIT_FOREVER, NULL);
if (ReceiveMailslotHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при создании mailslot","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
TimerMailSlot->Enabled = true;
char BufConnect[70];
sprintf(BufConnect, "\\\\%s\\mailslot\\msserver" , ServerHostName.c_str());
SendMailslotHandle = CreateFile(BufConnect, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (SendMailslotHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при открытии mailslot","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
char CompName[50];
unsigned long cnl = 50;
GetComputerName(CompName, &cnl);
int i=StrLen(CompName);
if(i>=50)
{
CompName[49]='\0';
}
unsigned long cbWritten;
char BufExchange[50];
MyCurrNomMessage=1;
strcpy(BufExchange,"1;");
strcat(BufExchange,CompName);
WriteFile(SendMailslotHandle,BufExchange, strlen(BufExchange)+1, &cbWritten, NULL);
}
}
//-----------------------прием и accept-----------------------------------------
void __fastcall TMainForm::TimerMailSlotTimer(TObject *Sender)
{
if(IsVisitApplicationBox) return;
int rc;
unsigned long cbMessages, cbMsgNumber, cbRead;
char *BufExchange;
rc = GetMailslotInfo(ReceiveMailslotHandle, NULL, &cbMessages, &cbMsgNumber, NULL);
if (!rc)
{
Application->MessageBox("Ошибка GetMailslotInfo","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
if (cbMsgNumber == 0) return;
BufExchange = new char[cbMessages];
ZeroMemory(BufExchange, cbMessages);
if (ReadFile(ReceiveMailslotHandle, BufExchange, cbMessages, &cbRead, NULL))
{
int HisCurrNomMessage;
char Buftmp[150];
strcpy(Buftmp,BufExchange);
HisCurrNomMessage=atoi(strtok(BufExchange,";"));
if(HisCurrNomMessage>HisPrevNomMessage)
{
HisPrevNomMessage=HisCurrNomMessage;
char *Buf;
Buf=AnsiStrScan(Buftmp,';');
Buf++;
if(IsServer && HisCurrNomMessage==1)
{
char BufConnect[100];
sprintf(BufConnect, "\\\\%s\\mailslot\\msclient" , Buf);
SendMailslotHandle = CreateFile(BufConnect, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (SendMailslotHandle == INVALID_HANDLE_VALUE)
{
Application->MessageBox("Ошибка при открытии mailslot","Ошибка",MB_OK+MB_ICONHAND);
Application->Terminate();
}
char *strPered=DannieToChar(0,KolKub,MaxOch);
MailSlotSend(strPered);
InterfaceBeginNewGame();
ChangeInterfacePerehodHoda(1);
}
else
{
Priem(CharToMas(Buf));
}
}
}
delete [] BufExchange;
}
//------------------------отправка----------------------------------------------
void __fastcall TMainForm::MailSlotSend(char *Buf)
{
unsigned long cbWritten;
char BufExchange[100];
MyCurrNomMessage++;
itoa(MyCurrNomMessage,BufExchange,10);
strcat(BufExchange,";");
strcat(BufExchange,Buf);
WriteFile(SendMailslotHandle, BufExchange, strlen(BufExchange)+1, &cbWritten, NULL);
}
//----------------------разрыв соединения---------------------------------------
void __fastcall TMainForm::MailSlotCloseConnection(void)
{
CloseHandle(SendMailslotHandle);
CloseHandle(ReceiveMailslotHandle);
TimerMailSlot->Enabled = false;
MyCurrNomMessage=0;
HisPrevNomMessage=0;
}
Подобные документы
Развитие и структура стека TCP/IP. Прикладной, транспортный, сетевой и канальный уровень. Гибкий формат заголовка. Поддержка резервирования пропускной способности. Протокол SNMP (Simple Network Management Protocol) для организации сетевого управления.
реферат [404,3 K], добавлен 02.06.2016Теоретические основы организации локальных компьютерных сетей: определение ЛС, топология, используемые протоколы обмена данными для связи рабочих станций и ЭВМ; программные средства. Сетевое окружение; идентификация компьютера с помощью IP-адреса.
курсовая работа [335,9 K], добавлен 15.05.2014Выбор технологии (ADSL) построения сетевой проводной инфраструктуры передачи данных для Интернет провайдера г. Донского и прилегающих микрорайонов; используемое программное обеспечение; подробная настройка биллинговой системы и сетевого оборудования.
курсовая работа [6,6 M], добавлен 23.06.2011Выбор и обоснование среды передачи данных, коммутационного оборудования. Физическая и логическая структуризация сети. Выбор и обоснование серверного оборудования. Система бесперебойного электроснабжения и мероприятия по обеспечению сетевой безопасности.
курсовая работа [4,0 M], добавлен 26.01.2009Функции, комплектация и характеристики системы видеонаблюдения. Сетевой коммутатор, его функции. Маршрутизатор - специализированный сетевой компьютер, имеющий два или более сетевых интерфейса и пересылающий пакеты данных между различными сегментами сети.
контрольная работа [674,3 K], добавлен 26.05.2015Архитектура вычислительных сетей, их классификация, топология и принципы построения. Передача данных в сети, коллизии и способы их разрешения. Протоколы TCP-IP. OSI, DNS, NetBios. Аппаратное обеспечение для передачи данных. Система доменных имён DNS.
реферат [1,1 M], добавлен 03.11.2010Формирование адресной структуры сети. Источник бесперебойного питания. Сетевой кабель, коммутаторы и короба. Логическая организация сети. Специализированные программные средства защиты информации. Применение антивирусного программного обеспечения.
курсовая работа [3,3 M], добавлен 13.07.2015Сетевой фильтр и его использование. Параметры фильтров-удлинителей, фильтров кондуктивных электромагнитных и синфазных помех, сетевых фильтров. Варисторы. Защита от намеренного силового воздействия (НСВ) по цепям питания. Степень варисторной защиты.
курсовая работа [688,8 K], добавлен 25.01.2009Определение телеобработки, содержание и основные этапы данного процесса, используемые методы и приемы. История развития обрабатывающих систем, современные направления их развития. Роль технологии скоростного обмена данных в развитии сетевых коммуникаций.
реферат [40,4 K], добавлен 25.12.2013История создания технологий беспроводного доступа. Описания набора стандартов связи для коммуникации в беспроводной локальной сетевой зоне. Исследование принципа работы беспроводной связи Wi-Fi. Анализ рынка инфраструктуры Wi-Fi операторского класса.
презентация [854,9 K], добавлен 28.10.2014