Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


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

Тип Реферат
Предмет Коммуникации и связь
Просмотров
1065
Размер файла
56 б
Поделиться

Ознакомительный фрагмент работы:

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

Федеральное агенство образования

Южно-Уральский Государственный Университет

Факультет экономики и управления

Кафедра информатики

Курсовая работа

по дисциплине “Локальные сети”

СОЗДАНИЕ СЕТЕВОЙ ИГРЫ

“КОСТИ”

Выполнили:

Студенты группы ЭиУ-423

Захезин С.М.

Капацина Д.

Давидович И.

Проверил:

Сартасов Е.М.

Челябинск, 2006


Аннотация

Создание сетевой игры «Кости». Игра ведется до 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 создается серверным процессом с помощью специально предназначенной для этого функции CreateMailslot. После создания серверный процесс получает идентификатор канала Mailslot. Пользуясь этим идентификатором, сервер может читать сообщения, посылаемые в канал клиентскими процессами. Однако сервер не может выполнять над каналом Mailslot операцию записи, так как этот канал предназначен только для односторонней передачи данных - от клиента к серверу. При ошибке функцией CreateMailslot возвращается значение INVALID_HANDLE_VALUE. Код ошибки можно определить при помощи функции GetLastError.

Прежде чем приступить к работе с каналом Mailslot, клиентский процесс должен его открыть. Для выполнения этой операции следует использовать функцию CreateFile. Запись сообщений в канал Mailslot выполняет клиентский процесс, вызывая для этого функцию WriteFile.

Серверный процесс может читать сообщения из созданного им канала Mailslot при помощи функции ReadFile. Заметим, что перед выполнением операции чтения следует проверить состояние канала Mailslot. Если в нем нет сообщений, то функцию ReadFile вызывать не следует. Для проверки состояния канала вы должны воспользоваться функцией GetMailslotInfo. С помощью функции SetMailslotInfo серверный процесс может изменить время ожидания для канала Mailslot уже после его создания.


Исходники

Main.cpp

#include <vcl.h>

#include <stdlib.h>

#include <StrUtils.hpp>

#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;i<KolKub;i++)

{

delete Kubiki1[i];

delete Kubiki2[i];

}

IsIgrayut=false;

InterfaceBezIgri();

IsVisitApplicationBox=false;

}

delete [] MasPriem;

}

//----------------процедура заполнения таблицы----------------------------------

void __fastcall TMainForm::ZapolnTabl(enum TypeDannihForTabl DannieForTabl)

{

if(IsServer)

{

if(DannieForTabl==yabrosil)

{

listboxOchki->Items->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;i<KolKub;i++)

{

Kubiki1[i] = new TImage(this);

Kubiki1[i]->Parent=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;i<KolKub;i++)

{

Kubiki1[i]->Visible=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;i<KolKub;i++)

{

delete Kubiki1[i];

delete Kubiki2[i];

}

switch(choosenProt)

{

case 0:

IPXSend("3;");

IPXCloseConnection();

break;

case 1:

TCPIPSend("3;");

TCPIPCloseConnection();

break;

case 2:

NetBiosSend("3;");

NetBiosCloseConnection();

break;

case 3:

MailSlotSend("3;");

MailSlotCloseConnection();

break;

case 4:

PipeSend("3;");

PipeCloseConnection();

break;

}

IsIgrayut=false;

InterfaceBezIgri();

}

IsVisitApplicationBox=false;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::menuQuitClick(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)

{

if (IsIgrayut)

{

menuStopClick(this);

if(IsIgrayut) CanClose=false;

}

}

//-------------------служебные функции преобразования типов---------------------

char* __fastcall TMainForm::DannieToChar(int Type, int MyCurOch, int MyWholeOch,

int ZnachKub1,int XKub1,int YKub1,

int ZnachKub2,int XKub2,int YKub2,

int ZnachKub3,int XKub3,int YKub3,

int ZnachKub4,int XKub4,int YKub4

)

{

AnsiString strTmp=IntToStr(Type)+";"+IntToStr(MyCurOch)+";"+IntToStr(MyWholeOch)+";"+

IntToStr(ZnachKub1)+";"+IntToStr(XKub1)+";"+IntToStr(YKub1)+";"+

IntToStr(ZnachKub2)+";"+IntToStr(XKub2)+";"+IntToStr(YKub2)+";"+

IntToStr(ZnachKub3)+";"+IntToStr(XKub3)+";"+IntToStr(YKub3)+";"+

IntToStr(ZnachKub4)+";"+IntToStr(XKub4)+";"+IntToStr(YKub4)+";";

return strTmp.c_str();

}

//---------------------------------------------------------------------------

int* __fastcall TMainForm::CharToMas(char* charPriem)

{

AnsiString strPriem=charPriem;

MasPriem=new int[15];

int y=0;

int PrevDelim=0;

int CurDelim;

for(int i=1;i<=strPriem.Length();i++)

{

if(IsDelimiter(";",strPriem,i))

{

MasPriem[y++]=StrToInt(MidStr(strPriem,PrevDelim+1,i-PrevDelim-1));

PrevDelim=i;

}

}

return MasPriem;

}

//Бросить---------------------------------------------------------------------------

//Закогнчить--------------------------------------------------------------------------

void __fastcall TMainForm::btBrosit2Click(TObject *Sender)

{

Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();

char strSend[70];

AnsiString strCat;

if(IsServer)

{

NomHoda++;

strCat="";

}

else

{

strCat="_2";

}

if(KolKub==1)

{

int ZnachKub, XKub, YKub ;

randomize();

ZnachKub = random(6)+1;

XKub=random(126)+14;

YKub=random(126)+14;

Bitmap1->LoadFromResourceName((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<HisWholeOch)

{

ViProigrali();

}

else

{

ChangeInterfacePerehodHoda(0);

}

}

//---------------------------------------------------------------------------

Ipx.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include <winsock.h>

#include <wsipx.h>

#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 <winsock.h>

#include <wsnetbs.h>

#include <stdio.h>

#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 <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]=' ';

}

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]=' ';

}

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;

}


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156450
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
63 457 оценок star star star star star
среднее 4.9 из 5
Тгу им. Г. Р. Державина
Реферат сделан досрочно, преподавателю понравилось, я тоже в восторге. Спасибо Татьяне за ...
star star star star star
РЭУ им.Плеханово
Альберт хороший исполнитель, сделал реферат очень быстро, вечером заказала, утром уже все ...
star star star star star
ФЭК
Маринаааа, спасибо вам огромное! Вы профессионал своего дела! Рекомендую всем ✌🏽😎
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Подогнать готовую курсовую под СТО

Курсовая, не знаю

Срок сдачи к 7 дек.

только что
только что

Выполнить задания

Другое, Товароведение

Срок сдачи к 6 дек.

1 минуту назад

Архитектура и организация конфигурации памяти вычислительной системы

Лабораторная, Архитектура средств вычислительной техники

Срок сдачи к 12 дек.

1 минуту назад

Организации профилактики травматизма в спортивных секциях в общеобразовательной школе

Курсовая, профилактики травматизма, медицина

Срок сдачи к 5 дек.

2 минуты назад

краткая характеристика сбербанка анализ тарифов РКО

Отчет по практике, дистанционное банковское обслуживание

Срок сдачи к 5 дек.

2 минуты назад

Исследование методов получения случайных чисел с заданным законом распределения

Лабораторная, Моделирование, математика

Срок сдачи к 10 дек.

4 минуты назад

Проектирование заготовок, получаемых литьем в песчано-глинистые формы

Лабораторная, основы технологии машиностроения

Срок сдачи к 14 дек.

4 минуты назад

2504

Презентация, ММУ одна

Срок сдачи к 7 дек.

6 минут назад

выполнить 3 задачи

Контрольная, Сопротивление материалов

Срок сдачи к 11 дек.

6 минут назад

Вам необходимо выбрать модель медиастратегии

Другое, Медиапланирование, реклама, маркетинг

Срок сдачи к 7 дек.

7 минут назад

Ответить на задания

Решение задач, Цифровизация процессов управления, информатика, программирование

Срок сдачи к 20 дек.

7 минут назад
8 минут назад

Все на фото

Курсовая, Землеустройство

Срок сдачи к 12 дек.

9 минут назад

Разработка веб-информационной системы для автоматизации складских операций компании Hoff

Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления

Срок сдачи к 1 мар.

10 минут назад
11 минут назад

перевод текста, выполнение упражнений

Перевод с ин. языка, Немецкий язык

Срок сдачи к 7 дек.

11 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно