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


Пример работы ТСР-сервера - часть 2


// Запуск бесконечного цикла while (1) { iSize = sizeof(clientaddr); // Прием соединения из очереди. Если его нет, // то функция будет ожидать соединения клиента sClient = accept(sServerListen, (struct sockaddr *)&clientaddr, &iSize); //Проверка корректности идентификатора клиентского сокета if (sClient == INVALID_SOCKET) { MessageBox(0, "Accept filed", "Error", 0); break; }

// Создание нового потока для работы с клиентом hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)sClient, 0, &dwThreadId); if (hThread == NULL) { MessageBox(0, "Create thread filed", "Error", 0); break; } CloseHandle(hThread); } // Закрытие сокета после работы с потоком closesocket(sServerListen); return 0; }

Теперь перейдем к рассмотрению написанного. В функции _tWinMain происходит загрузка библиотеки WinSock версии 2.2.

После этого создается новый поток с помощью функции CreateThread. Серверная функция accept блокирует работу программы, и если ее вызвать в основном потоке, то окно заблокируется и не будет реагировать на сообщения. Именно поэтому для сервера создается отдельный поток, в котором он и будет работать. Получается, что основная программа работает в своем потоке, а параллельно ей работает еще один поток, в котором сервер прослушивает необходимый порт.

С точки зрения программирования, поток — это функция, которая будет работать параллельно с другими потоками ОС. Таким образом, в ОС Windows реализуется многозадачность. За более подробной информацией о потоках обратитесь к документации или специализированной литературе по Visual C++.

В качестве третьего параметра функции CreateThread, создающей новый поток, необходимо передать указатель на функцию, которая должна работать в отдельном потоке.

Самое интересное происходит в функции NetThread. Все функции, которые там используются, мы уже рассмотрели, и здесь я только собрал все сказанное в одно целое.

Первым делом создается сокет функцией socket. Затем корректными параметрами заполняется структура localaddr, которая имеет тип sockaddr_in. Для предложенного сервера заполняются три параметра:




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



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