Программирование на C++ глазами хакера


. Использование сокетов через события Windows - часть 2


Для каждого сокета можно назначить только одно сообщение на разные события. Это означает, что нельзя по событию FD_READ окну посылать одно сообщение, а по FD_WRITE — другое.

Прежде чем приступать к рассмотрению примера, надо разобраться с параметрами, которые будут передаваться в функцию WndProc при возникновении события. Вспомним, как выглядит эта функция:

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

Параметры wParam и lParam содержат вспомогательную информацию (в зависимости от события). Для событий сети в параметре wParam хранится дескриптор сокета, на котором произошло событие. Таким образом, вам не надо хранить массив созданных сокетов, их всегда можно получить в событии.

Параметр lParam состоит из двух слов: младшее определяет событие, а старшее — код ошибки. Вот теперь можно переходить к рассмотрению реального примера. Создайте новое приложение Win32 Application, назовите проект WSASel. Откройте файл WSASel.cpp и подкорректируйте функцию _tWinMain. Как всегда, весь код нужно добавить до цикла обработки сообщений. Всю функцию вы можете увидеть в листинге 4.19.

Листинг 4.19. Функция _tWinMain
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable;

// Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WSASEL, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);

// Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; }

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WSASEL);

WSADATA wsd; if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { MessageBox(0, "Can't load WinSock", "Error", 0); return 0; }

SOCKET sServerListen, sClient; struct sockaddr_in localaddr, clientaddr; HANDLE hThread; DWORD dwThreadId; int iSize;

sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sServerListen == SOCKET_ERROR) { MessageBox(0, "Can't load WinSock", "Error", 0); return 0; }




Начало  Назад  Вперед



Книжный магазин