Курсовая: Создание сетевой игры - текст курсовой. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Курсовая

Создание сетевой игры

Банк рефератов / Компьютерные сети

Рубрики  Рубрики реферат банка

закрыть
Категория: Курсовая работа
Язык курсовой: Русский
Дата добавления:   
 
Скачать
Архив Zip, 59 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникальной курсовой работы

Узнайте стоимость написания уникальной работы

Федеральное агенство образования Южно-Уральский Государственный Университет Факультет экономики и управления Кафедра информатики Курсовая работа по дисциплине “Локальные сети” СОЗДАНИЕ СЕТЕВОЙ ИГРЫ “ КОСТИ ” Выполнили: Студенты группы ЭиУ-423 Захезин С.М. Капацина Д. Давидович И. Проверил: Сартасов Е.М. Челябинск, 200 6 Аннотация Создание сетевой игры «Кости». Игра ведется до 21 очк а, работа сделанна на 5 протоко лах. Введение Правила игры Один из игроков является сервером, другой – клиен том. Для начала игры необходимо выбрать протокол, по которому будет уста новлена связь. Длительность игры зависит от набранных очков и желания иг раков. Протоколы IPX Протокол IPX предоставляет возможность программам, з апущенным на рабочих станциях, обмениваться пакетами данных без подтве рждения. В сети Novell NetWare наиболее быстрая передача данных при наиболее эконо мном использовании памяти реализуется именно протоколом IPX. Протоколы SPX и NETBIOS сделаны на базе IPX и поэтому требуют дополнительных ресурсов. Формат пакета IPX Формат передаваемых по сети пакетов представлен на рис. 2. Рис. 2. Структура пакета IPX Пакет можно разделить на две части - заголовок и передаваемые данные. Все поля, представленные на рис. 2, кроме последнего (Data), представляют собой заг оловок пакета. Заголовок пакета выполняет ту же роль, что и конверт обычн ого письма - там располагается адрес назначения, обратный адрес и некото рая служебная информация. Особенностью формата пакета является то, что все поля заголовка содержа т значения в перевернутом формате, т. е. по младшему адресу записывается с тарший байт данных, а не младший, как это принято в процессорах фирмы Intel. По этому перед записью значений в многобайтовые поля заголовка необходим о выполнить соответствующее преобразование. Представление данных в за головке пакета соответствует, например, формату целых числел в компьюте ре IBM-370 (серия ЕС ЭВМ). . Работа с драйвером IPX/SPX Первое, что должна сделать программа, желающая рабо тать в сети с протоколом IPX или SPX, - проверить, установлен ли драйвер соответ ствующего протокола. Затем необходимо получить адрес вызова этого драй вера - точку входа API (Application Programm Interface - интерфейс для приложений). В дальнейшем прог рамма вызывает драйвер при помощи команды межсегментного вызова проце дуры по адресу точки входа API драйвера IPX/SPX. Схема "клиент-сервер" Обычно в сети одна из рабочих станций принимает зап росы на выполнение каких-либо действий от других рабочих станций. Так ка к станция обслуживает запросы, она называется сервером (serve - обслуживать , server - обслуживающее устройство). Выполнив запрос, сервер посылает ответ в з апросившую станцию, которая называется клиентом. В сети может быть много серверов и много клиентов. Одни и те же клиенты мог ут посылать запросы разным серверам. Говоря более строго, сервером или клиентом является не рабочая станция, а запущенная на ней программа. В мультизадачной среде разные программы, запущенные одновременно на одной и той же рабочей станции могут являтьс я и клиентами, и серверами. Программа-сервер, выполнив очередной запрос, переходит в состояние ожид ания. Она ждет прихода пакета данных от программы-клиента. В зависимости от содержимого этого пакета программа-сервер может выполнять различны е действия, в соответствии с логикой работы программы. Например, она може т принять от программы-клиента дополнительные пакеты данных или переда ть свои пакеты. Сервер и клиент при необходимости на какое-то время или навсегда могут п оменяться местами, изменив свое назначение на противоположное. Для того, чтобы создавать программы-серверы и программы-клиенты, нам нео бходимо научиться выполнять две задачи: · инициализацию сервера и клиента; o прием и передачу пак етов данных. Инициализация сервера и клиента Для инициализации программ сервера и клиента, рабо тающих на базе IPX, недостаточно убедиться в наличии соответствующего дра йвера и получить точку входа в его API. Необходимо выполнить некоторые подг отовительные действия для того, чтобы программа могла принимать и перед авать пакеты данных. Прежде всего необходимо, чтобы программа-сервер или программа-клиент идентифицировали себя в сети при помощи механизма сок етов. Динамически распределяемые сокеты выдаются программам как бы во в ременное пользование (на время их работы) по специальному запросу. Перед началом работы программа должна запросить сокет у протокола IPX, а перед за вершением - освободить его. При реализации схемы обмена данными "клиент-с ервер" сервер обычно принимает пакеты на сокете, значение которого извес тно программам-клиентам. Сами же программы-клиенты могут использовать л ибо то же самое значение сокета, либо получать свой сокет динамически. Кл иент может сообщить серверу свой сокет просто передав его в пакете данны х (так как мы предполагаем, что сокет сервера известен программе-клиенту). После определения сокета необходимо узнать сетевой адрес станций-полу чателей. Для того чтобы клиент мог послать запрос серверу, необходимо кр оме сокета сервера знать его сетевой адрес - номер сети и адрес рабочей ст анции в сети. Прием и передача пакетов данных Рассмотрим теперь процедуру приема пакетов данных средствами IPX. Прием и передачу пакетов выполняет сетевой адаптер, работающий с исполь зованием прерываний. Прикладные программы не работают напрямую с драйв ером сетевого адаптера. Все свои запросы на прием и передачу пакетов они направляют драйверу IPX (программа ipx.exe или ipxodi.exe), который, в свою очередь, обращ ается к драйверу сетевого адаптера. Для приема или передачи пакета прикладная программа должна подготовит ь пакет данных, сформировав его заголовок, и построить так называемый бл ок управления событием ECB (Event Control Block). В блоке ECB задается адресная информация дл я передачи пакета, адрес самого передаваемого пакета в оперативной памя ти и некоторая другая информация. Подготовив блок ECB, прикладная программа передает его адрес соответству ющей функции IPX для выполнения операции приема или передачи пакета. Функции IPX, принимающие или передающие пакет, не выполняют ожидания завер шения операции, а сразу возвращают управление вызвавшей их программе. Пр ием или передача выполняются сетевым адаптером автономно и асинхронно по отношению к программе, вызвавшей функцию IPX для передачи данных. После того, как операция передачи данных завершилась, в соответствующем поле б лока ECB устанавливается признак. Программа может периодически проверять ECB для обнаружения признака завершения операции. TCP / IP Рассмотрим работу семейства протоколов TCP/IP при обмене данными между двумя процессам и telnet, выполняющимися на двух разных хостах, входящих в две разные сети, сое диненные посредством маршрутизатора. Работа протокола TCP Протокол верхнего уровня (приложений/процессов) разделяет данные на кус очки (это процесс называется инкапсуляцией) и каждому кусочку добавляет заголовок. То, что получается в результате, называется TCP-сегментом. TCP-сегмент Заголовок TCP-сегмента Данные Модули протокола TCP обмениваются TCP-сегментами. Протокол TCP обеспечивает надежную дуплексную передачу с предварительн ой установкой связи и с разрывом соединения. Надежная – осуществляется контроль получения данных. Сегмент, на данны е которого не пришло подтверждения через определенное время, посылаетс я снова. Дуплексная – значит, передача в две стороны, туда и обратно, передача тол ько в дону сторону называется симплексной. Формат заголовка TCP -сегмента Формат заголовка TCP-сегмента (заголовок состоит из 32- битных слов): 0 ( бит ) 4 8 12 16 20 24 28 31 Source Port Destination Port Sequence Number Acknowledgement Number Offset Reserved Flags Window Checksum Urgent Point Options Padding · Source Port и Destination Port – это адреса процессов (отправителя и получателя соответственно). Грубо говоря, это просто числовые идентификаторы, которые присвоены про цессам-протоколам верхнего уровня. Некоторые протоколы верхнего уровн я имеют стандартные значения номеров портов: Номер порта Процесс 20 ftp-data (передача данных по ftp) 21 fpt (команды) 23 telnet 25 smtp 70 gopher 80 www-http и т.д. · Sequence Number – порядковый номер первого октета сегмента в потоке данных. · Acknowledgement Number – количество полученных октетов данных · Window – с колько октетов адресат готов принять · Offset – н ачало данных сегмента · Flags – уп равляющие флаги, используемые для установки и разрыва связи, для подтвер ждения получения данных, для передачи экстренных данных. · Checksum – к онтрольная сумма: все байты заголовка суммируются отправителем и резул ьтат помещается в это поле. По получению адресат также суммирует все бай ты заголовка и сравнивает с этим числом. Если значения равны, значит, все в порядке. · Urgent Point – определяет положение экстренных данных внутри сегмента. Pipe Канал – сре дство обмена информацией между процессами с одновременной синхронизац ией, реализующей дисциплину FIFO (первый вошел – первый вышел), то есть проч итанные сообщения удаляются. Канал – файл специального типа, особенности: - время существован ия канала ограниченно временем работы процесса - размер канала огра ничен количеством блоков, доступных для прямой адресации (то есть на дис ке он не создается, а существует только в буферах ввода-вывода). - Используется толь ко для общения между родственными процессами (поскольку родственники н аследуют все открытые файлы предка). Создание Создает канал системный вызов pipe: int fd[2]; pipe(int *fd); fd[0] - дескриптор файла для ввода fd[1] - дескриптор файла для вывода Но файловый дескриптор – локальная для процесса х арактеристика, как могут два разных процесса использовать один файловы й дескриптор? Для этого должна возникнуть такая ситуация А это возмож но только в том случае, если ПР1 и ПР2 являются родственниками – ведь пото мок полностью наследует u-area предка, в том числе и таблицу файловых дескрип торов. Значит, либо ПР1 должен быть потомком ПР2, либо наоборот, либо они оба должны быть потомками третьего процесса NetBios Протокол NetBios работает на трех уровнях семиуровневой модели OSI: сетевом уровне, транспортном уровне и на уровне каналов связи. Уровень каналов с вязи обеспечивает механизм обмена сообщениями между программами, рабо тающими на станциях в рамках канала связи или сессии. NETBIOS может обеспечить интерфейс более высокого уровня, чем протоколы IPX и SPX. Протокол NETBIOS поддерживается в сетях IBM (IBM PC LAN), Novell NetWare, Microsoft Windows for Workgroups и в других сетях. К сожалению, нет единого стандарта на протокол NETBIOS, поэтому в сетевом програ ммном обеспечении разных фирм используются разные интерфейсы для вызо ва команд NETBIOS. С нашей точки зрения, наибольший интерес представляет применение NETBIOS в се тях Novell NetWare и Microsoft Windows for Workgroups. Мы рассмотрим основные возможности NETBIOS, связанные с пе редачей данных между рабочими станциями в пределах одного логического сегмента сети. Использовать NETBIOS проще, чем IPX или SPX. Однако, так как в среде Novell NetWare нужен специальный эмулятор NETBIOS, эффективность работы программы може т снизиться. Кроме того, для эмулятора нужна дополнительная память, так к ак он реализован в виде резидентной программы. Адресация станций и программ Для идентификации рабочей станции протоколы IPX и SPX и спользуют номер сети, адрес станции в сети и сокет. Адрес станции определ яется на аппаратном уровне и представляет собой число длиной 6 байт. Номе р сети занимает 4 байта. Сокеты выделяются динамически драйвером протоко ла IPX или могут быть получены в Novell. Протокол NETBIOS использует другой механизм адресации станций и программ. Дл я адресации станции используются имена размером 16 байт. Каждая станция и меет одно постоянное имя (permanent name), которое образуется из аппаратного адреса добавлением к нему слева десяти нулевых байт. Кроме постоянного имени протокол NETBIOS позволяет доба влять (и удалять) обычные имена и групповые имена . Обычные имена служат для идентификации рабочей ст анции, групповые могут служить для посылки пакетов одновременно нескол ьким станциям в сети. Постоянное имя удалить нельзя, так как оно полность ю определяется аппаратным обеспечением станции. При добавлении обычного имени протокол NETBIOS опрашивает всю сеть для прове рки уникальности имени. Групповое имя может быть одинаковое на нескольк их станциях, поэтому при добавлении группового имени опрос сети не выпол няется. После добавления нового имени этому имени присваивается так называемы й номер имени (name number), который используется для передачи данных по сети. Сравнивая методы адресации, используемые протоколами IPX/SPX и NETBIOS, нетрудно з аметить, что метод адресации протокола NETBIOS более удобен. Вы можете адресов ать данные не только одной станции (как в IPX и SPX) или всем станциям сразу (как в IPX), но и группам станций, имеющим одинаковое групповое имя. Это может быть удобно, если в сети работают несколько групп пользователей, которые инт енсивно обмениваются данными между собой. Другим преимуществом схемы адресации протокола NETBIOS перед схемой адресац ии протоколов IPX/SPX можно считать отсутствие необходимости получать в фир ме Novell свой собственный номер сокета для идентификации вашего программно го обеспечения. Вы можете придумать свое собственное уникальное группо вое имя, включающее, например, название программы и вашей фирмы, и использ овать его для работы по схеме клиент-сервер. MailSlot Канал Mailslot Mailslot создается серверным процессом с помощью специально предназначенной для этого функции CreateMailslot . После создания серве рный процесс получает идентификатор канала Mailslot . Пользуясь этим идентификато ром, сервер может читать сообщения, посылаемые в канал клиентскими проце ссами. Однако сервер не может выполнять над каналом Mailslot операцию записи, так как этот канал предназначен только для односторонней передачи данных - от клиент а к серверу. При ошибке функцией CreateMailslot Mailslot возвращается значен ие INVALID_HANDLE_VALUE INVALID_HANDLE_VALUE . Код ошибки можно опр еделить при помощи функции GetLastError GetLastError . Прежде чем приступить к работе с каналом Mailslot Mailslot , клиентский процесс должен его открыть. Для выполнения этой операции следует использовать ф ункцию CreateFile CreateFile . Запись сообщений в к анал Mailslot Mailslot выполняет клиентски й процесс, вызывая для этого функцию WriteFile. Серверный процесс может читать сообщения из созданного им канала Mailslot Mailslot при помощи функции ReadFile. Заметим, что перед выполнением операции чтения следует проверить со стояние канала Mailslot Mailslot . Если в нем нет сообще ний, то функцию ReadFile ReadFile вызывать не следует. Для проверки состояния канала вы должны воспользоваться функцией GetMailslot GetMailslot Info. С помощью функции SetMailslot SetMailslot Mailslot Info серверный процесс м ожет изменить время ожидания для канала Mailslot уж е посл е его создания. Исходники Main.cpp #include #include #include #pragma hdrstop #include "Main.h" #include "Podkluch.h" #include "GameParam.h" #include "About.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "LMDCustomBevelPanel" #pragma link "LMDCustomControl" #pragma link "LMDCustomPanel" #pragma link "LMDSimplePanel" #pragma link "LMDBackPanel" #pragma link "LMDCustomParentPanel" #pragma link "LMDBaseControl" #pragma link "LMDBaseGraphicControl" #pragma link "LMDBaseLabel" #pragma link "LMDControl" #pragma link "LMDCustomSimpleLabel" #pragma link "LMDSimpleLabel" #pragma link "lmdcont" #pragma link "LMDCustomComponent" #pragma link "LMDCustomStatusBar" #pragma link "LMDStatusBar" #pragma link "LMDCustomPanelFill" #pragma link "LMDPanelFill" #pragma link "LMDCustomScrollBox" #pragma link "LMDListBox" #pragma link "LMDCustomFormFill" #pragma link "LMDFormFill" #pragma link "LMDWndProcComponent" #pragma link "LMDBaseShape" #pragma link "LMDShapeControl" #pragma link "LMDCustomLabel" #pragma link "LMDDrawEdge" #pragma link "LMDLabel" #pragma link "LMDBaseImage" #pragma link "LMDCustomGroupBox" #pragma link "LMDCustomLImage" #pragma link "LMDGraphicControl" #pragma link "LMDGroupBox" #pragma link "LMDLImage" #pragma link "LMDBaseGraphicButton" #pragma link "LMDCustomShapeButton" #pragma link "LMDShapeButton" #pragma resource "*.dfm" TMainForm *MainForm; extern bool IsServer; extern AnsiString Protocoli[]; extern int KolKub; extern int MaxOch; extern int choosenProt; extern AnsiString ServerHostName; extern AnsiString ServerHostIP; extern bool IsHostName; extern bool IsIgrayut; extern int NomHoda; extern int MyCurOch; extern int MyWholeOch; extern int HisWholeOch; extern bool IsYaFixed; extern bool IsHeFixed; extern int HisWinPoPartiam; extern int MyWinPoPartiam; extern int NomPartia; int *MasPriem; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) //--------------------------------------------------------------------------- void __fastcall TMainForm::FormCreate(TObject *Sender) FirstTimeShow=true; IsVisitApplicationBox=false; //--------------------------------------------------------------------------- void __fastcall TMainForm::FormActivate(TObject *Sender) if(FirstTimeShow) FirstTimeShow=false; InterfaceBezIgri(); menuBeginClick(this); //--------------------------------------------------------------------------- void __fastcall TMainForm::menuBeginClick(TObject *Sender) if (IsIgrayut) menuStopClick(this); if (IsIgrayut) return; if (UstanParametrov()) //вызов 2-х форм для установки параметров //---- подключение ---- switch(choosenProt) case 0: IPXConnect(); break; case 1: TCPIPConnect(); break; case 2: NetBiosConnect(); break; case 3: MailSlotConnect(); break; case 4: PipeConnect(); break; if(IsServer) lbStat->Caption=" Ожидается соединение с клиентом ..."; //--------------------------------------------------------------------------- bool __fastcall TMainForm::UstanParametrov(void) int md1,md2; for(;;) md1=FormParamConnect->ShowModal(); FormParamConnect->Close(); if (md1==mrOk) if (IsServer) md2=FormGameParam->ShowModal(); if (md2==mrOk) return 1; else continue; else return 1; else return 0; void __fastcall TMainForm::OtobrazhDannihSopernika(int *MasPriem) Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap(); AnsiString strCat; if(IsServer) strCat="_2"; else strCat=""; if(KolKub==1) Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[3])+strCat); Kubiki2[0]->Picture->Bitmap=Bitmap2; Kubiki2[0]->Left=MasPriem[4]; Kubiki2[0]->Top=MasPriem[5]; Kubiki2[0]->Visible=true; else if (KolKub==2) Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[3])+strCat); Kubiki2[0]->Picture->Bitmap=Bitmap2; Kubiki2[0]->Left=MasPriem[4]; Kubiki2[0]->Top=MasPriem[5]; Kubiki2[0]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[6])+strCat); Kubiki2[1]->Picture->Bitmap=Bitmap2; Kubiki2[1]->Left=MasPriem[7]; Kubiki2[1]->Top=MasPriem[8]; Kubiki2[1]->Visible=true; else if (KolKub==3) Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[3])+strCat); Kubiki2[0]->Picture->Bitmap=Bitmap2; Kubiki2[0]->Left=MasPriem[4]; Kubiki2[0]->Top=MasPriem[5]; Kubiki2[0]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[6])+strCat); Kubiki2[1]->Picture->Bitmap=Bitmap2; Kubiki2[1]->Left=MasPriem[7]; Kubiki2[1]->Top=MasPriem[8]; Kubiki2[1]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[9])+strCat); Kubiki2[2]->Picture->Bitmap=Bitmap2; Kubiki2[2]->Left=MasPriem[10]; Kubiki2[2]->Top=MasPriem[11]; Kubiki2[2]->Visible=true; else Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[3])+strCat); Kubiki2[0]->Picture->Bitmap=Bitmap2; Kubiki2[0]->Left=MasPriem[4]; Kubiki2[0]->Top=MasPriem[5]; Kubiki2[0]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[6])+strCat); Kubiki2[1]->Picture->Bitmap=Bitmap2; Kubiki2[1]->Left=MasPriem[7]; Kubiki2[1]->Top=MasPriem[8]; Kubiki2[1]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[9])+strCat); Kubiki2[2]->Picture->Bitmap=Bitmap2; Kubiki2[2]->Left=MasPriem[10]; Kubiki2[2]->Top=MasPriem[11]; Kubiki2[2]->Visible=true; Bitmap2->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(MasPriem[12])+strCat); Kubiki2[3]->Picture->Bitmap=Bitmap2; Kubiki2[3]->Left=MasPriem[13]; Kubiki2[3]->Top=MasPriem[14]; Kubiki2[3]->Visible=true; HisWholeOch=MasPriem[2]; lbHisWholeOch->Caption=IntToStr(MasPriem[2]); delete Bitmap2; //-----------пришли данные соперника-------------------------------------------- void __fastcall TMainForm::Priem(int *MasPriem) if(MasPriem[0]==0) //первый ответ сервера клиенту AnsiString mess; mess="Ваш соперник выбрал следующие параметры игры:\nКоличество кубиков : "+IntToStr(MasPriem[1])+"\nМаксимальное количество очков: "+IntToStr(MasPriem[2]); IsVisitApplicationBox=true; Application->MessageBoxA(mess.c_str()," Параметры игры ",MB_OK); KolKub=MasPriem[1]; MaxOch=MasPriem[2]; InterfaceBeginNewGame(); ChangeInterfacePerehodHoda(0); IsVisitApplicationBox=false; else if (MasPriem[0]==1) // соперник бросил shapeBrosil->Brush->Color=0x0000CE00; OtobrazhDannihSopernika(MasPriem); if(!IsServer) NomHoda++; enum TypeDannihForTabl DannieForTabl; DannieForTabl=hebrosil; ZapolnTabl(DannieForTabl); if(IsYaFixed && HisWholeOch>MyWholeOch && HisWholeOch<=MaxOch) ViProigrali(); else if (HisWholeOch>MaxOch) lbHisWholeOch->Font->Color=clRed; ViViigrali(); else if(IsYaFixed && HisWholeOch<=MyWholeOch) ChangeInterfacePerehodHoda(0); else ChangeInterfacePerehodHoda(1); else if (MasPriem[0]==2) // соперник зафиксировал IsHeFixed=true; lbHisWholeOch->Font->Color=clRed; shapeFixed->Brush->Color=0x000000CE; if(!IsServer) NomHoda++; enum TypeDannihForTabl DannieForTabl; DannieForTabl=hefixed; ZapolnTabl(DannieForTabl); if(IsYaFixed && MyWholeOch==HisWholeOch) Nichia(); else if(MyWholeOch>HisWholeOch) ViViigrali(); else ChangeInterfacePerehodHoda(1); else if (MasPriem[0]==3) // соперник разорвал соединение IsVisitApplicationBox=true; Application->MessageBoxA(" Ваш соперник разорвал соединение .\n Игра окончена ."," Разрыв соединения ",MB_OK); switch(choosenProt) case 0: IPXCloseConnection(); break; case 1: TCPIPCloseConnection(); break; case 2: NetBiosCloseConnection(); break; case 3: MailSlotCloseConnection(); break; case 4: PipeCloseConnection(); break; for (int i=0;iItems->Add(" "+IntToStr(NomHoda)+"; "+IntToStr(MyCurOch)); listboxOchki->TopIndex=NomHoda-1; if(NomHoda==9) listboxOchki->Width=236; listboxOchki->Left=14; else if (DannieForTabl==yafixed) listboxOchki->Items->Add(" "+IntToStr(NomHoda)+"; 0"); listboxOchki->TopIndex=NomHoda-1; if(NomHoda==9) listboxOchki->Width=236; listboxOchki->Left=14; else if (DannieForTabl==hebrosil) listboxOchki->SetItemPart(NomHoda-1,2," "+IntToStr(MasPriem[1])); listboxOchki->TopIndex=NomHoda-1; else listboxOchki->SetItemPart(NomHoda-1,2," 0"); listboxOchki->TopIndex=NomHoda-1; else if(DannieForTabl==yabrosil) listboxOchki->SetItemPart(NomHoda-1,1," "+IntToStr(MyCurOch)); listboxOchki->TopIndex=NomHoda-1; else if (DannieForTabl==yafixed) listboxOchki->SetItemPart(NomHoda-1,1," 0"); listboxOchki->TopIndex=NomHoda-1; else if (DannieForTabl==hebrosil) listboxOchki->Items->Add(" "+ IntToStr(NomHoda)+";; "+IntToStr(MasPriem[1])); listboxOchki->TopIndex=NomHoda-1; if(NomHoda==9) listboxOchki->Width=236; listboxOchki->Left=14; else listboxOchki->Items->Add(" "+ IntToStr(NomHoda)+";; 0"); listboxOchki->TopIndex=NomHoda-1; if(NomHoda==9) listboxOchki->Width=236; listboxOchki->Left=14; //------------------------------ Результаты -------------------------------------- void __fastcall TMainForm::ViProigrali(void) IsVisitApplicationBox=true; HisWinPoPartiam++; Application->MessageBoxA(" Вы проиграли !\n Играем да льше !"," Поражение ",MB_OK+MB_ICONEXCLAMATION); InterfaceIgraemDalshe(); IsVisitApplicationBox=false; //--------------------------------- void __fastcall TMainForm::ViViigrali(void) IsVisitApplicationBox=true; MyWinPoPartiam++; Application->MessageBoxA(" Вы выиграли !\n Играем да льше !"," Победа !!",MB_OK+MB_ICONEXCLAMATION); InterfaceIgraemDalshe(); IsVisitApplicationBox=false; //---------------------------------- void __fastcall TMainForm::Nichia(void) IsVisitApplicationBox=true; MyWinPoPartiam++; HisWinPoPartiam++; Application->MessageBoxA(" Вы сыграли вничью !\n И граем дальше !"," Ничья ",MB_OK+MB_ICONEXCLAMATION); InterfaceIgraemDalshe(); IsVisitApplicationBox=false; //---------------------------------------------------------------------------- void __fastcall TMainForm::menuOProgrClick(TObject *Sender) FormAbout->ShowModal(); //---------------------------- Интерфейсы --------------------------------------- void __fastcall TMainForm::InterfaceBezIgri(void) MyWholeOch=0; HisWholeOch=0; MyCurOch=0; NomHoda=0; IsYaFixed=false; IsHeFixed=false; NomPartia=0; MyWinPoPartiam=0; HisWinPoPartiam=0; ServerHostName=""; ServerHostIP=""; IsIgrayut=false; menuStop->Enabled=false; panParam->Visible=false; lbNomPartia->Visible=false; panSchetPoPartiam->Visible=false; gbPole1->Top=15; gbPole2->Top=15; gbTabl->Top=15; this->Height=400; this->Caption=" Игровое поле "; btBrosit->Enabled=false; btFix->Enabled=false; btBrosit->Color=clCream; btFix->Color=clCream; shapeBrosil->Brush->Color=clSilver; shapeFixed->Brush->Color=clSilver; shapeBrosil->Caption->Font->Color=clWhite; shapeFixed->Caption->Font->Color=clWhite; lbMyWholeOch->Caption="0"; lbHisWholeOch->Caption="0"; lbMaxOch2->Caption=""; listboxOchki->Clear(); listboxOchki->Width=218; listboxOchki->Left=23; AnsiString tmp=AnsiQuotedStr(" Игра -> Начать новую игр у ",'"'); lbStat->Caption="Для начала новой игры выберете пункт меню "+tmp; //-------------------------------------------------------------- void __fastcall TMainForm::InterfaceBeginNewGame(void) menuStop->Enabled=true; if(IsServer) Caption=Caption+" Сервер "; imStolServer->Parent=panPole1; imStolClient->Parent=panPole2; else Caption=Caption+" Клиент "; imStolClient->Parent=panPole1; imStolServer->Parent=panPole2; for (int i=0;iParent=panPole1; Kubiki1[i]->Transparent=true; Kubiki2[i] = new TImage(this); Kubiki2[i]->Parent=panPole2; Kubiki2[i]->Transparent=true; panParam->Visible=true; lbNomPartia->Visible=true; panSchetPoPartiam->Visible=true; gbPole1->Top=80; gbTabl->Top=80; gbPole2->Top=80; this->Height=470; lbKolKub->Caption=IntToStr(KolKub); lbMaxOch->Caption=IntToStr(MaxOch); lbMaxOch2->Caption=IntToStr(MaxOch); lbNomPartia->Caption=" Партия № 1"; lbSchetPoPartiam->Caption="0 : 0"; NomPartia=1; IsIgrayut=true; //--------------------------------------------------------- void __fastcall TMainForm::ChangeInterfacePerehodHoda(bool HozhuYa) if(HozhuYa) btBrosit->Enabled=true; btFix->Enabled=true; btBrosit->Color=clCream; btFix->Color=clCream; shapeBrosil->Caption->Font->Color=clWhite; shapeFixed->Caption->Font->Color=clWhite; lbStat->Caption=" Твой ход ..."; if (MyWholeOch>MaxOch-KolKub) IsVisitApplicationBox=true; Application->MessageBoxA(" Единственно верный вариант для Вас сейчас - зафиксировать очки !"," Предупреждение ",MB_OK+MB_ICONEXCLAMATION); IsVisitApplicationBox=false; else btBrosit->Enabled=false; btFix->Enabled=false; shapeBrosil->Brush->Color=clSilver; shapeFixed->Brush->Color=clSilver; shapeBrosil->Caption->Font->Color=clBlack; shapeFixed->Caption->Font->Color=clBlack; lbStat->Caption=" Ход соперника ..."; //-------------------------------------------------------------------------- void __fastcall TMainForm::InterfaceIgraemDalshe(void) NomPartia++; MyWholeOch=0; HisWholeOch=0; MyCurOch=0; NomHoda=0; IsYaFixed=false; IsHeFixed=false; IsIgrayut=true; lbNomPartia->Caption=" Партия № "+IntToStr(NomPartia); lbSchetPoPartiam->Caption=IntToStr(MyWinPoPartiam)+" : "+IntToStr(HisWinPoPartiam); listboxOchki->Clear(); listboxOchki->Width=218; listboxOchki->Left=23; lbMyWholeOch->Caption="0"; lbHisWholeOch->Caption="0"; lbMyWholeOch->Font->Color=clGreen; lbHisWholeOch->Font->Color=clGreen; btBrosit->Color=clCream; btFix->Color=clCream; shapeBrosil->Brush->Color=clSilver; shapeFixed->Brush->Color=clSilver; for (int i=0;iVisible=false; Kubiki2[i]->Visible=false; if(IsServer) ChangeInterfacePerehodHoda(1); else ChangeInterfacePerehodHoda(0); //----------------------- Завершение игры --------------------------------------- void __fastcall TMainForm::menuStopClick(TObject *Sender) IsVisitApplicationBox=true; if(Application->MessageBoxA(" Вы действительно хотите за вершить игру ?"," Завершение игры ",MB_YESNO)==IDYES) for (int i=0;iLoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub)+strCat); Kubiki1[0]->Picture->Bitmap=Bitmap1; Kubiki1[0]->Left=XKub; Kubiki1[0]->Top=YKub; Kubiki1[0]->Visible=true; MyCurOch=ZnachKub; MyWholeOch=MyWholeOch+MyCurOch; strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub, XKub, YKub)); else if (KolKub==2) int ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2; randomize(); ZnachKub1 = random(6)+1; XKub1=random(126)+14; YKub1=random(52)+14; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub1)+strCat); Kubiki1[0]->Picture->Bitmap=Bitmap1; Kubiki1[0]->Left=XKub1; Kubiki1[0]->Top=YKub1; Kubiki1[0]->Visible=true; ZnachKub2 = random(6)+1; XKub2=random(126)+14; YKub2=random(52)+88; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub2)+strCat); Kubiki1[1]->Picture->Bitmap=Bitmap1; Kubiki1[1]->Left=XKub2; Kubiki1[1]->Top=YKub2; Kubiki1[1]->Visible=true; MyCurOch=ZnachKub1+ZnachKub2; MyWholeOch=MyWholeOch+MyCurOch; strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2)); else if (KolKub==3) int ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3; randomize(); ZnachKub1 = random(6)+1; XKub1=random(126)+14; YKub1=random(27)+14; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub1)+strCat); Kubiki1[0]->Picture->Bitmap=Bitmap1; Kubiki1[0]->Left=XKub1; Kubiki1[0]->Top=YKub1; Kubiki1[0]->Visible=true; ZnachKub2 = random(6)+1; XKub2=random(126)+14; YKub2=random(27)+63; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub2)+strCat); Kubiki1[1]->Picture->Bitmap=Bitmap1; Kubiki1[1]->Left=XKub2; Kubiki1[1]->Top=YKub2; Kubiki1[1]->Visible=true; ZnachKub3 = random(6)+1; XKub3=random(126)+14; YKub3=random(28)+112; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub3)+strCat); Kubiki1[2]->Picture->Bitmap=Bitmap1; Kubiki1[2]->Left=XKub3; Kubiki1[2]->Top=YKub3; Kubiki1[2]->Visible=true; MyCurOch=ZnachKub1+ZnachKub2+ZnachKub3; MyWholeOch=MyWholeOch+MyCurOch; strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3)); else int ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3, ZnachKub4, XKub4, YKub4; randomize(); ZnachKub1 = random(6)+1; XKub1=random(52)+14; YKub1=random(52)+14; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub1)+strCat); Kubiki1[0]->Picture->Bitmap=Bitmap1; Kubiki1[0]->Left=XKub1; Kubiki1[0]->Top=YKub1; Kubiki1[0]->Visible=true; ZnachKub2 = random(6)+1; XKub2=random(52)+88; YKub2=random(52)+14; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub2)+strCat); Kubiki1[1]->Picture->Bitmap=Bitmap1; Kubiki1[1]->Left=XKub2; Kubiki1[1]->Top=YKub2; Kubiki1[1]->Visible=true; ZnachKub3 = random(6)+1; XKub3=random(52)+14; YKub3=random(52)+88; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub3)+strCat); Kubiki1[2]->Picture->Bitmap=Bitmap1; Kubiki1[2]->Left=XKub3; Kubiki1[2]->Top=YKub3; Kubiki1[2]->Visible=true; ZnachKub4 = random(6)+1; XKub4=random(52)+88; YKub4=random(52)+88; Bitmap1->LoadFromResourceName((unsigned int)HInstance,"KUB"+IntToStr(ZnachKub4)+strCat); Kubiki1[3]->Picture->Bitmap=Bitmap1; Kubiki1[3]->Left=XKub4; Kubiki1[3]->Top=YKub4; Kubiki1[3]->Visible=true; MyCurOch=ZnachKub1+ZnachKub2+ZnachKub3+ZnachKub4; MyWholeOch=MyWholeOch+MyCurOch; strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2,ZnachKub3, XKub3, YKub3, ZnachKub4, XKub4, YKub4)); switch(choosenProt) case 0: IPXSend(strSend); break; case 1: TCPIPSend(AnsiString(strSend)); break; case 2: NetBiosSend(strSend); break; case 3: MailSlotSend(strSend); break; case 4: PipeSend(strSend); break; enum TypeDannihForTabl DannieForTabl; DannieForTabl=yabrosil; ZapolnTabl(DannieForTabl); lbMyWholeOch->Caption=MyWholeOch; if (MyWholeOch>MaxOch) lbMyWholeOch->Font->Color=clRed; ViProigrali(); else if(IsHeFixed && MyWholeOch>HisWholeOch && MyWholeOch<=MaxOch) ViViigrali(); else if(IsHeFixed && MyWholeOch<=HisWholeOch) ChangeInterfacePerehodHoda(1); else ChangeInterfacePerehodHoda(0); delete Bitmap1; //--------------------------------------------------------------------------- void __fastcall TMainForm::btFix2Click(TObject *Sender) IsYaFixed=true; if(IsServer) NomHoda++; btFix->Color=clRed; btBrosit->Color=clCream; lbMyWholeOch->Font->Color=clRed; switch(choosenProt) case 0: IPXSend("2;"); break; case 1: TCPIPSend("2;"); break; case 2: NetBiosSend("2;"); break; case 3: MailSlotSend("2;"); break; case 4: PipeSend("2;"); break; enum TypeDannihForTabl DannieForTabl; DannieForTabl=yafixed; ZapolnTabl(DannieForTabl); if(IsHeFixed && MyWholeOch==HisWholeOch) Nichia(); else if(MyWholeOch #include #include "IPX.h" #include "Main.h" #include "Podkluch.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #define IPX_SERVER_SOCKET 0x4504 #define IPX_CLIENT_SOCKET 0x4514 #define WSA_NETEVENT (WM_USER+2) SOCKET IPXSocket; sockaddr_ipx CallAddress; sockaddr_ipx OurAddress; extern bool IsServer; extern int KolKub; extern int MaxOch; //-----------------------Подключение-------------------------------------------- void __fastcall TMainForm::IPXConnect(void) WSADATA WSAData; int rc, OptVal=1; rc = WSAStartup(MAKEWORD(2,0), &WSAData); if (rc != 0) Application->MessageBox("Ошибка инициализации WSAStartup","Ошибка",MB_OK+MB_ICONHAND); Application->Terminate(); IPXSocket = socket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX); if (IPXSocket == INVALID_SOCKET) Application->MessageBox("Протокол IPX не установлен","Ошибка",MB_OK+MB_ICONHAND); Application->Terminate(); memset(&OurAddress, 0, sizeof(OurAddress)); OurAddress.sa_family = AF_IPX; if(IsServer) OurAddress.sa_socket = htons((unsigned short)(IPX_SERVER_SOCKET)); else OurAddress.sa_socket = htons((unsigned short)(IPX_CLIENT_SOCKET)); if (bind(IPXSocket, (LPSOCKADDR)&OurAddress, sizeof(sockaddr_ipx)) == SOCKET_ERROR) Application->MessageBox("Адресная ошибка IPX","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); rc = setsockopt(IPXSocket, SOL_SOCKET, SO_BROADCAST, (char *)&OptVal, sizeof(OptVal)); if (rc == SOCKET_ERROR) rc = WSAGetLastError(); Application->MessageBox("Ошибка setsockopt","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); if(!IsServer) memset(&CallAddress, 0, sizeof(CallAddress)); CallAddress.sa_family = AF_IPX; CallAddress.sa_socket = htons(IPX_SERVER_SOCKET); CallAddress.sa_nodenum[0] = 0xff; CallAddress.sa_nodenum[1] = 0xff; CallAddress.sa_nodenum[2] = 0xff; CallAddress.sa_nodenum[3] = 0xff; CallAddress.sa_nodenum[4] = 0xff; CallAddress.sa_nodenum[5] = 0xff; rc = sendto(IPXSocket, "connect", 8, 0, (PSOCKADDR)&CallAddress, sizeof(SOCKADDR)); if (rc == SOCKET_ERROR) rc = WSAGetLastError(); Application->MessageBox("Ошибка sendto IPX","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); rc = WSAAsyncSelect(IPXSocket, Handle, WSA_NETEVENT, FD_READ); if (rc != 0) Application->MessageBox("Ошибка WSAAsyncSelect","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); WindowProc = IPXWndProc; //------------------------------прием--------------------------------------- void __fastcall TMainForm::IPXWndProc(Messages::TMessage &Message) int rc, l=sizeof(CallAddress); char Buf[80]; if (Message.Msg == WSA_NETEVENT) if (Message.LParam == FD_READ) rc = recvfrom((SOCKET)Message.WParam, Buf, sizeof(Buf)-1, 0, (PSOCKADDR)&CallAddress, &l); if (rc == SOCKET_ERROR) rc = WSAGetLastError(); Application->MessageBox("Ошибка recvfrom IPX","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); if (rc >= 1) if(!strcmp(Buf,"connect")) char *strPered=DannieToChar(0,KolKub,MaxOch); IPXSend(strPered); InterfaceBeginNewGame(); ChangeInterfacePerehodHoda(1); else if(IsVisitApplicationBox) return; Priem(CharToMas(Buf)); WndProc(Message); //-------------------------отправка--------------------------------------------- void __fastcall TMainForm::IPXSend (char* Buf) int rc; rc = sendto(IPXSocket, Buf, strlen(Buf)+1, 0, (PSOCKADDR)&CallAddress, sizeof(SOCKADDR)); if (rc == SOCKET_ERROR) rc = WSAGetLastError(); Application->MessageBox("Ошибка sendto IPX","Ошибка",MB_OK+MB_ICONHAND); closesocket(IPXSocket); IPXSocket = INVALID_SOCKET; Application->Terminate(); //-------------------------разрыв--------------------------------------------- void __fastcall TMainForm::IPXCloseConnection(void) closesocket(IPXSocket); WSACleanup(); TCP .cpp //--------------------------------------------------------------------------- #pragma hdrstop #include "TCPIP.h" #include "Main.h" #include "Podkluch.h" //--------------------------------------------------------------------------- #pragma package(smart_init) extern bool IsServer; extern bool IsHostName; extern AnsiString ServerHostName; extern AnsiString ServerHostIP; extern int KolKub; extern int MaxOch; //----------Подключение--------------------------------------------------- void __fastcall TMainForm::TCPIPConnect(void) if (IsServer==true) ClientSocket1->Close(); ServerSocket1->Open(); else ServerSocket1->Close(); if (IsHostName) ClientSocket1->Host=ServerHostName; else ClientSocket1->Host=ServerHostIP; ClientSocket1->Open(); //---------Accept--------------------------------------------------------------- void __fastcall TMainForm::ServerSocket1Accept(TObject *Sender, TCustomWinSocket *Socket) char *strPered=DannieToChar(0,KolKub,MaxOch); TCPIPSend(AnsiString(strPered)); InterfaceBeginNewGame(); ChangeInterfacePerehodHoda(1); //----------Отправка------------------------------------------------------------ void __fastcall TMainForm::TCPIPSend(AnsiString strSend) if(IsServer) ServerSocket1->Socket->Connections[0]->SendText(strSend); else ClientSocket1->Socket->SendText(strSend); //-------------Получение-------------------------------------------------------- void __fastcall TMainForm::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) if(IsVisitApplicationBox) return; AnsiString strPriem=Socket->ReceiveText(); Priem(CharToMas(strPriem.c_str())); //--------------------------------------------------------------------------- void __fastcall TMainForm::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) // //--------------------------------------------------------------------------- void __fastcall TMainForm::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) //StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteHost; //--------------------------------------------------------------------------- void __fastcall TMainForm::ServerSocket1Listen(TObject *Sender, TCustomWinSocket *Socket) //StatusBar1->Panels->Items[0]->Text="Listening..."; //--------------Разрыв соединения------------------------------------------- void __fastcall TMainForm::TCPIPCloseConnection(void) ServerSocket1->Close(); ClientSocket1->Close(); //-----------Обработка ошибок--------------------------------------------------- void __fastcall TMainForm::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) if(ErrorEvent==eeConnect) ErrorCode=0; Application->MessageBox("Не удалось осуществить соединение с сервером.\nУбедитесь, что се рвер ожидает запроса клиента.","Ошибка",MB_OK+MB_ICONHAND); else Application->MessageBox("Ошибка TCP/IP","Ошибка",MB_OK+MB_ICONHAND); Application->Terminate(); void __fastcall TMainForm::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) // //----------------------------------------------------------------------------- Netbios.cpp //--------------------------------------------------------------------------- #pragma hdrstop #include #include #include #include "NetBios.h" #include "Main.h" #include "Podkluch.h" #define NETBIOS_SERVER_NAME "Kosti Server " #define NETBIOS_CLIENT_NAME "Kosti Client " #define WSA_ACCEPT (WM_USER + 1) #define WSA_NETEVENT (WM_USER+2) //--------------------------------------------------------------------------- #pragma package(smart_init) SOCKET NetBiosSocket; sockaddr_nb OurAddress; sockaddr_nb CallAddress; extern bool IsServer; extern int KolKub; extern int MaxOch; //----------------------------Подключение--------------------------------------- void __fastcall TMainForm::NetBiosConnect(void) WSADATA WSAData; int rc; rc = WSAStartup(MAKEWORD(2,0), &WSAData); if (rc != 0) Application->MessageBox("Ошибка инициализации WSAStartup","Ошибка",MB_OK+MB_ICONHAND); Application->Terminate(); int Lana; for (Lana=0;Lana<1000;Lana++) NetBiosSocket = socket(AF_NETBIOS, SOCK_SEQPACKET, -Lana); if (NetBiosSocket == INVALID_SOCKET) continue; memset(&OurAddress, 0, sizeof(OurAddress)); OurAddress.snb_family = AF_NETBIOS; OurAddress.snb_type = NETBIOS_UNIQUE_NAME; if(IsServer) strcpy(OurAddress.snb_name,NETBIOS_SERVER_NAME); 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 #include #include #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 #include #include #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;
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
Кризис среднего возраста в Африке наступает в 9 лет.
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, курсовая по компьютерным сетям "Создание сетевой игры", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru