Программирование стратегических игр с DirectX 9.0
bda5893f

Функция vConnect()


Функция vConnect() вызывается, когда игрок щелкает по кнопке Connect. Вот как выглядит ее код:

sockaddr_in saServerAddress; int iPort = 6001,iStatus; LPHOSTENT lpHost; char szHost[128];

// Установка глобальных переменных g_bIsServer = 0; // Инициализация параметров сервера, смените указанный здесь IP-адрес // на корректный IP-адрес вашей сети sprintf(szHost, "192.168.0.2"); // Инициализация дескриптора сокета g_skClientSocket = INVALID_SOCKET; // Создание сокета g_skClientSocket = socket(AF_INET, SOCK_STREAM, 0); // Проверка наличия ошибок if(g_skClientSocket == INVALID_SOCKET) { vShowText("** ERROR ** Could Not Create Socket"); return; } vShowText("<- Socket Created ->"); // Инициализация структуры данных адреса сервера memset(&saServerAddress, 0, sizeof(sockaddr_in)); // Установка значений по умолчанию saServerAddress.sin_family = AF_INET; // Загрузка IP-адреса saServerAddress.sin_addr.s_addr = inet_addr(szHost);

// Если задано имя сервера, а IP-адрес отсутствует, // попытаемся получить требуемое значение if(saServerAddress.sin_addr.s_addr == INADDR_NONE) { vShowText("<- Looking Up Host ID ->"); // Получаем имя сервера lpHost = gethostbyname(szHost); // Проверяем, получили ли мы что-нибудь if (lpHost != NULL) { // Загружаем адрес сервера из его данных saServerAddress.sin_addr.s_addr = ((LPIN_ADDR)lpHost->h_addr)->s_addr; } else { vShowText("** ERROR ** Could Not locate host"); return; } } // Устанавливаем порт сервера saServerAddress.sin_port = htons(iPort); // Пытаемся подключиться к серверу iStatus = connect(g_skClientSocket, (struct sockaddr*)&saServerAddress, sizeof(sockaddr)); // Проверяем наличие ошибок if(iStatus == SOCKET_ERROR) { vShowText("** ERROR ** Could Not Connect To Server"); return; } // Убираем кнопки DestroyWindow(hBU_Connect); DestroyWindow(hBU_Host); vShowText("<- Connected To Server ->"); // Устанавливаем флаг подключения g_bConnected = 1; // Устанавливаем флаг, указывающий что право хода принадлежит нам g_bMyTurn = 1; // Отображаем кнопку Turn Done hBU_TurnDone = CreateWindow( "BUTTON", "Turn Done", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 5, 280, 100, 28, g_hWnd, (HMENU)IDC_hBU_TurnDone, g_hInst, NULL); vShowText(":Server waiting, make your turn");

Код подключения очень похож на тот, который я показывал вам в примере подключения к веб-серверу. Клиент сперва получает адрес сервера, а затем пытается установить соединение с ним. Как только соединение успешно установлено, клиент убирает кнопки Connect и Host и отображает новую кнопку Turn Done. В этот момент клиенту дается время, чтобы он мог сделать свой ход. Ход выполнения функции показан на рис. 14.17.


Рис. 14.17. Ход выполнения функции vConnect()



Содержание раздела