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

Функция vHost()


Представьте на минуту, что вы загрузили программу походовой игры и щелкнули по кнопке Host. Начнет выполняться следующий код:

sockaddr_in saServerAddress; sockaddr_in saClientAddress; int iClientSize = sizeof(sockaddr_in); int iPort = 6001; int iStatus;

// Установка глобальных переменных g_bIsServer = 1; // Инициализация дескриптора сокета g_skListenSocket = INVALID_SOCKET; // Создание сокета g_skListenSocket = socket(AF_INET, SOCK_STREAM, 0); // Проверим, не произошла ли ошибка if(g_skListenSocket == INVALID_SOCKET) { vShowText("** ERROR ** Could Not Create Socket"); return; } vShowText("<- Socket Created ->"); // Очищаем структуру адреса сокета memset(&saServerAddress, 0, sizeof(sockaddr_in)); // Инициализируем структуру адреса сокета saServerAddress.sin_family = AF_INET; saServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); saServerAddress.sin_port = htons(iPort); // Пытаемся выполнить привязку if(bind(g_skListenSocket, (sockaddr*) &saServerAddress, sizeof(sockaddr)) == SOCKET_ERROR) { vShowText("** ERROR ** Could Not Bind Socket"); return; } vShowText("<- Socket Bound ->"); // Прослушиваем подключения iStatus = listen(g_skListenSocket, 32); if(iStatus == SOCKET_ERROR) { vShowText("** ERROR ** Could Not Listen"); // Закрываем сокет closesocket(g_skListenSocket); return; } vShowText("<- Socket Listening ->"); g_skClientSocket = accept(g_skListenSocket, (struct sockaddr*)&saClientAddress, &iClientSize); if(g_skClientSocket == INVALID_SOCKET) { vShowText("** ERROR ** Could Not Accept Client"); // Закрываем сокет closesocket(g_skListenSocket); return; } // Убираем кнопки DestroyWindow(hBU_Connect); DestroyWindow(hBU_Host); vShowText("<- Client Connected ->"); // Устанавливаем флаг подключения g_bConnected = 1; // Устанавливаем флаг, сообщающий, что сейчас // ход делает другой игрок g_bMyTurn = 0; // Ждем первый ход клиента vTurnDone();

Первая часть кода реализует логику для подключения клиента. Фактически программа прослушивает порт, ожидая соединения и принимает соединение, когда оно происходит. После этого код убирает кнопки Host и Connect, чтобы пользователь не мог щелкнуть по ним еще раз. Затем программа устанавливает переменную хода, чтобы она указывала, что контроль над игрой находится у клиента. И, наконец, ход заканчивается вызовом функции завершения хода. Это переводит сервер в режим приема, чтобы он мог получить сообщение о завершении хода от клиента. Все эти действия показаны на рис.14.16.


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



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