![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Файл client/client.c
#include < windows.h> #include < windowsx.h> #include < winsock.h> #include < commctrl.h> #include " resource.h"
// ---------------------------------------------------- // Описание функций // ----------------------------------------------------
// Функция главного окна LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// Функция для обработки сообщения WM_CREATE BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
// Функция для обработки сообщения WM_DESTROY void WndProc_OnDestroy(HWND hWnd);
// Функция для обработки сообщения WM_COMMAND void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
// Функция для обработки сообщения WM_SIZE void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);
// Установка соединения void SetConnection(HWND hWnd);
// Передача сообщения void SendMsg(HWND hWnd);
// Порт сервера #define SERV_PORT 5000
#define IDS_STATUSBAR 802
// ---------------------------------------------------- // Глобальные переменные // ----------------------------------------------------
// Идентификатор приложения HINSTANCE hInst;
// Название приложения char szAppName[] = " WClient";
// Заголовок главного окна приложения char szAppTitle[] = " Windows Socket Client Demo";
// Идентификатор органа управления Statusbar HWND hwndSb;
// Сокет клиента SOCKET srv_socket;
// Локальный сокет SOCKADDR _IN local_sin;
// Адрес сервера SOCKADDR _IN dest_sin;
// ---------------------------------------------------- // Функция WinMain // ----------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg;
hInst = hInstance;
// Проверяем, не было ли это приложение запущено ранее hWnd = FindWindow(szAppName, NULL); if(hWnd) { // Если окно приложения было свернуто в пиктограмму, // восстанавливаем его if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
// Выдвигаем окно приложения на передний план SetForegroundWindow(hWnd); return FALSE; }
// Регистрируем класс окна memset(& wc, 0, sizeof(wc));
// Поля wc.cbSize и wc.hIconSm определены в структуре // WNDCLASSEX, которой можно пользоваться для // регистрации класса окна в Windows 95 wc.cbSize = sizeof(WNDCLASSEX);
// Поле wc.hIconSm задает идентификатор маленькой // пиктограммы, которая будет отображаться в левой // части заголовка окна (в области системного меню). // Загружаем пиктограмму из ресурсов приложения при // помощи функции LoadImage, так как функция // LoadIcon может загрузить только обычную пиктограмму wc.hIconSm = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON_SM), IMAGE_ICON, 16, 16, 0);
// Завершаем заполнение структуры WNDCLASSEX wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;
// Для загрузки обычной пиктограммы вы можете // использовать функцию LoadImage wc.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 32, 32, 0);
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName;
// Вызываем функцию RegisterClassEx, которая выполняет // регистрацию окна if(! RegisterClassEx(& wc))
// В случае ошибки пытаемся зарегистрировать окно // функцией RegisterClass if(! RegisterClass((LPWNDCLASS)& wc.style)) return FALSE;
// Инициализация библиотеки органов управления // общего назначения. Необходима для работы с // органом управления Statusbar InitCommonControls();
// Создаем главное окно приложения hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(! hWnd) return(FALSE);
// Отображаем окно ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
// Запускаем цикл обработки сообщений while(GetMessage(& msg, NULL, 0, 0)) { TranslateMessage(& msg); DispatchMessage(& msg); } return msg.wParam; }
// ---------------------------------------------------- // Функция WndProc // ----------------------------------------------------
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { // Для сообщения WM_CREATE назначаем обработчик, // расположенный в функции WndProc_OnCreate HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
// Для сообщения WM_COMMAND назначаем обработчик, // расположенный в функции WndProc_OnCommand HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
// Для сообщения WM_SIZE назначаем обработчик, // расположенный в функции WndProc_OnSize HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize);
// Для сообщения WM_DESTROY назначаем обработчик, // расположенный в функции WndProc_OnDestroy HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } }
// ---------------------------------------------------- // Функция WndProc_OnCreate // ----------------------------------------------------
BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { int rc; WSADATA WSAData; char szTemp[128];
// Инициализация и проверка версии Windows Sockets rc = WSAStartup (MAKEWORD(1, 1), & WSAData); if(rc! = 0) { MessageBox(NULL, " WSAStartup Error", " Error", MB_OK); return FALSE; }
// Отображаем описание и версию системы Windows Sockets // в окне органа управления Statusbar wsprintf(szTemp, " Server use %s %s", WSAData.szDescription, WSAData.szSystemStatus);
hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);
return TRUE; }
// ---------------------------------------------------- // Функция WndProc_OnDestroy // ----------------------------------------------------
#pragma warning(disable: 4098) void WndProc_OnDestroy(HWND hWnd) { // Освобождение ресурсов, полученных для // работы с Windows Sockets WSACleanup ();
// Завершение цикла обработки сообщений PostQuitMessage(0); return FORWARD_WM_DESTROY (hWnd, DefWindowProc); }
// ---------------------------------------------------- // Функция WndProc_OnSize // ----------------------------------------------------
#pragma warning(disable: 4098) void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy) { SendMessage(hwndSb, WM_SIZE, cx, cy); return FORWARD_WM_SIZE (hWnd, state, cx, cy, DefWindowProc); }
// ---------------------------------------------------- // Функция WndProc_OnCommand // ----------------------------------------------------
#pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_EXIT:
// Уничтожение главного окна прилоджения DestroyWindow(hWnd); break;
case IDM_CONNECT:
// Установка соединения с сервером SetConnection(hWnd); break;
case IDM_SEND:
// Посылка сообщения серверу SendMsg(hWnd); break;
default: MessageBox(NULL, " Unknown command", " Error", MB_OK); }
return FORWARD_WM_COMMAND (hWnd, id, hwndCtl, codeNotify, DefWindowProc); }
// ---------------------------------------------------- // Функция SetConnection // ----------------------------------------------------
void SetConnection(HWND hWnd) { PHOSTENT phe;
// Создаем сокет srv_socket = socket(AF_INET, SOCK_STREAM, 0); if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, " socket Error", " Error", MB_OK); return; }
// Устанавливаем адрес IP и номер порта dest_sin.sin_family = AF_INET;
// Определяем адрес узла
// Адрес локального узла для отладки phe = gethostbyname (" localhost ");
// Адрес удаленного узла //phe = gethostbyname (" mycomputer");
if(phe == NULL) { closesocket (srv_socket); MessageBox(NULL, " gethostbyname Error", " Error", MB_OK); return; }
// Копируем адрес узла memcpy((char FAR *)& (dest_sin.sin_addr), phe-> h_addr, phe-> h_length);
// Другой способ указания адреса узла // dest_sin.sin_addr.s_addr= // inet_addr(" 200.200.200.201");
// Копируем номер порта dest_sin.sin_port = htons(SERV_PORT);
// Устанавливаем соединение if(connect(srv_socket, (PSOCKADDR)& dest_sin, sizeof(dest_sin)) < 0) { closesocket (srv_socket); MessageBox(NULL, " connect Error", " Error", MB_OK); return; }
// В случае успеха выводим сообщение об установке // соединения с узлом SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)" Connected"); }
// ---------------------------------------------------- // Функция SendMsg // ----------------------------------------------------
void SendMsg(HWND hWnd) { char szBuf[80]; lstrcpy(szBuf, " Test string");
// Посылаем сообщение send (srv_socket, szBuf, lstrlen(szBuf), 0); }
Вы сможете разобраться с исходными текстами этого приложения самостоятельно, так как все использованные в нем функции были нами уже описаны. Обратим ваше внимание только на функцию SetConnection, предназначенную для установки канала связи с сервером. Если вы будете проверять работу приложений SERVER и CLIENT на одном и том же компьютере, адрес сервера должен быть указан следующим образом:
phe = gethostbyname (" localhost ");
Для того чтобы установить канал связи с компьютером по его имени, закройте символом комментария приведенную выше строку и уберите символ комментария со строки, расположенной ниже:
//phe = gethostbyname (" mycomputer");
Разумеется, вы должны также изменить имя компьютера. Можно также указать адрес узла в виде десятичных цифр, для чего следует убрать символ комментария со следующей строки: // dest_sin.sin_addr.s_addr = inet_addr (" 200.200.200.201");
Идентификаторы ресурсов приложения CLIENT определены в файле resource.h, представленном в листинге 5.5.
|