"По запросу пользователя "current_clients " вернуть список клиентов, подключенных к серверу в настоящее время"
Сетевое программирование с использованием сокетов. Программа, установленная на компьютере пользователя, которая может осуществлять сетевой запрос с целью получения объекта. Правила взаимодействия между этими программами; технология взаимодействия.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 25.12.2019 |
Размер файла | 110,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине
"Информационные технологии"
"По запросу пользователя "current_clients " вернуть список клиентов, подключенных к серверу в настоящее время"
Самара 2019
Содержание
Введение
1. Сетевое программирование с использованием сокетов
1.1 Библиотека Winsock
2. Разработка приложения клиент-сервер
2.1 Приложение клиент
2.2 Приложение сервера
3. Демонстрация работы связки программы клиент-сервера
Заключение
Список использованных источников
Приложения
Введение
В общем случае для организации работы пользователей сети с информационными ресурсами, распределенными по различным компьютерам, необходимы три составляющих:
-программа, установленная на компьютере пользователя, которая может осуществлять сетевой запрос с целью получения объекта, и предназначенная для его обработки (например, просмотра, изменения или печати документа); программирование сокет сетевой
-программа, установленная, как правило, на компьютере, где расположен информационный объект, которая может осуществлять по запросу поиск и пересылку объекта, а также упорядочивание доступа к нему нескольких пользователей;
-правила (протокол) взаимодействия между этими программами.
Технология взаимодействия, в которой одна программа запрашивает выполнение какой-либо совокупности действий ("запрашивает услугу"), а другая ее выполняет, называется технологией "клиент-сервер". Участники такого взаимодействия называются соответственно клиентом (client) и сервером (server). Достаточно часто клиентом (или сервером) называют компьютеры, на которых функционирует то или иное клиентское (или серверное) программное обеспечение.
Следует особо отметить, что набор действий, понимаемых как запрашиваемая услуга, - это не обязательно чтение (получение) объекта. В том числе это может быть сохранение (запись), пересылка объекта и т.д.
При большом числе компьютеров (десятки, сотни и даже тысячи) предприятия чаще всего полагаются на сети модели "клиент-сервер". Упрощенно можно считать, что в такой сети отдельный компьютер подключается к одному или нескольким мощным компьютерам, которые называются серверами.
Сервер - это компьютер, или выполняющаяся на нём программа, которая предоставляет клиентам доступ к общим ресурсам и управляет этими ресурсами.
Клиент - пользователь (получатель) услуг и/или ресурсов, которые предоставляет сервер.
В серверных сетях серверы оснащены процессорами типа Intel Pentium 4 и сетевой операционной системой.
Роль серверов состоит в обеспечение централизованной защиты и управлении трафиком, а так же в предоставление клиентам ресурсов: информации, приложений и доступа к устройствам совместного пользования (например, к принтерам). В клиент - серверной среде в роли клиентов выступают настольные ПК (именно ПК, а не неинтеллектуальные терминалы!) под управлением операционной системы типа Windows 95 или Windows NT Workstation. Как правило, клиент использует собственные вычислительные мощности для обработки информации, полученной от сервера, но полагается на сервер в части предоставления необходимых данных и приложений. Такое распределение ролей в обработке информации носит название клиентской (front - end) и серверной (back - end) обработки.
Наряду с успешным функционированием в собственной "родной" среде, сети модели клиент - сервер могут работать с микрокомпьютерами и мэйнфреймами. Именно эта гибкость в сочетании достаточно низкой (по сравнению с традиционными решениями) стоимостью и составляет привлекательность клиент - серверных сетей. Работая в такой среде на компьютере - клиенте, можно "вкушать плоды" трех разных методов обработки информации: автономной работы, взаимодействия с другими ПК сети и подключения к серверу или мэйнфрейму для доступа к хранящейся там информации.
1. Сетевое программирование с использованием сокетов
1.1 Библиотека Winsock
Именованные каналы пригодны для организации межпроцессного взаимодействия как в случае процессов, выполняющихся на одной и той же системе, так и в случае процессов, выполняющихся на компьютерах, связанных друг с другом локальной или глобальной сетью. Эти возможности будут продемонстрированы на примере клиент-серверной системы.
Однако, как именованные каналы, так и почтовые ящики обладают тем недостатком, что они не являются промышленным стандартом. Это обстоятельство усложняет перенос программ в системы, не принадлежащие семейству Windows, хотя именованные каналы не зависят от протоколов и могут выполняться поверх многих стандартных промышленных протоколов, например, TCP/IP.
Возможность взаимодействия с другими системами обеспечивается в Windows поддержкой сокетов (sockets) Windows Sockets - совместимого и почти точного аналога сокетов Berkeley Sockets, де-факто играющих роль промышленного стандарта. Результирующая система способна функционировать в глобальных сетях, использующих протокол TCP/IP, что, например, позволяет серверу принимать запросы от клиентов UNIX или каких-либо других, отличных от Windows систем.
Привлекая средства обеспечения взаимодействия между разнородными системами, ориентированные на стандарты, интерфейс Winsock открывает перед программистами возможность доступа к высокоуровневым протоколам и приложениям, таким как ftp, http, RPC и СОМ, которые в совокупности предоставляют богатый набор высокоуровневых моделей, обеспечивающих поддержку межпроцессного сетевого взаимодействия для систем с различной архитектурой.
Winsock API разрабатывался как расширение Berkley Sockets API для среды Windows и поэтому поддерживается всеми системами Windows. К преимуществам Winsock можно отнести следующее:
* Перенос уже имеющегося кода, написанного для Berkeley Sockets API, осуществляется непосредственно.
* Системы Windows легко встраиваются в сети, использующие как версию IPv4 протокола TCP/IP, так и постепенно распространяющуюся версию IPv6. Помимо всего остального, версия IPv6 допускает использование более длинных IP-адресов, преодолевая существующий 4-байтовый адресный барьер версии IPv4.
* Сокеты могут использоваться совместно с перекрывающимся вводом/выводом Windows (глава 14), что, помимо всего прочего, обеспечивает возможность масштабирования серверов при увеличении количества активных клиентов.
* Сокеты можно рассматривать как дескрипторы (типа HANDLE) файлов при использовании функций ReadFile и WriteFile и, с некоторыми ограничениями, при использовании других функций, точно так же, как в качестве дескрипторов файлов сокеты применяются в UNIX. Эта возможность оказывается удобной в тех случаях, когда требуется использование асинхронного ввода/вывода и портов завершения ввода/вывода.
* Существуют также дополнительные, непереносимые расширения.
Функции библиотеки "winsock"
С помощью #include "winsock.h" подключаем библиотечные функции. Объявляем константу с номером версии, которую мы будем поддерживать - WINSOCK_VERSION.
Функция WSAStartup инициализирует WinSock. Эта функция всегда самая первая при начале работы с WinSock. Первый параметр - это версия, которая будет использоваться. Младший байт основная версия, старший байт расширение версии. Если инициализация состоялась, то вернется нулевое значение. Второй параметр - это указатель на структуру WSADATA, в которую возвратятся параметры инициализации. WSACleanup завершает использование данного DLL и прерывает обращение к функциям WinSock. При удачном выполнении вернется нуль.
#include "stdafx.h"
#include "winsock.h"
const int WINSOCK_VERSION = 0x0101;
void main()
{
WSADATA wsaData;
if (WSAStartup(WINSOCK_VERSION, &wsaData))
{
printf ("winsock not bi initialized !\n");
WSACleanup();
}
else printf("Winsock initial OK !!!!\n");
if (WSACleanup())
printf("Error Cleapir\n");
else
printf("Cleapir Good !!!!!\n");
}
Cоздания основного средства коммуникации в Winsock- сокета (socket). С точки зрения WinsockAPI сокет - это дескриптор, который может получать или отправлять данные. Создавая сокет мы должны указать его параметры: сокет использует TCP/IP протокол или IPX (если TCP/IP, то какой тип и т.д.). Так как следующие разделы данной статьи будут ориентированы на TCP/IP протокол, то остановимся на особенностях сокетов использующих этот протокол. Мы можем создать два основных типа сокетов работающих по TCP/IP протоколу - SOCK_STREAM и SOCK_DGRAM (RAW socket). Разница в том, что для первого типа сокетов (их еще называют TCP или connection-based socket), для отправки данных сокет должен постоянно поддерживать соединение с адресатом, при этом доставка пакета адресату гарантирована. Во втором случае наличие постоянного соединения не нужно, но информацию о том, дошел ли пакет, или нет - получить невозможно (так называемые UDP или connectionless sockets). И первый и второй типы сокетов имеют своё практическое применение. Теперь мы можем использовать этот сокет для обмена данными с другими клиентами winsock-клиентами и не только. Для того, что бы установить соединение с другой машиной необходимо знать ее IP адрес и порт. Удалённая машина должна "слушать" этот порт на предмет входящих соединений (т.е. она выступает в качестве сервера). В таком случае наше приложение это клиент. Для того что бы послать данные используем функцию send. При ошибке функция возвращает SOCKET_ERROR. Если данные получены, то функция возвращает размер полученного пакета данных (а примере - actual_len) При ошибке функция возвращает SOCKET_ERROR. Функции send/recv будут ждать пока не выйдет тайм-аут или не отправится/придет пакет данных. Это соответственно вызывает задержку в работе программы. Процедура закрытия активного соединения происходит с помощью функций shutdown и closesocket. Различают два типа закрытия соединений: abortive и graceful. Первый вид - это экстренное закрытие сокета (closesocket). В таком случае соединение разрывается моментально. Вызов closesocket имеет мгновенный эффект. После вызова closesocket сокет уже недоступен. Рассмотренный нами Winsock-механизм обмена данными очень прост. От программиста требуется лишь выработать свой "протокол" общения удалённых машин и реализовать его с помощью данных функций.
2. Разработка приложения клиент-сервер
2.1 Приложение клиент
Приложение клиент служит для обмена сообщениями с сервером или же с другими пользователями.
Рисунок 2.1 - Интерфейс программы клиент.
Код программы начинается с подключения необходимых библиотек, включая сокет. Далее идёт объявление переменных. WSADATA служит для активации использования сокетов в Windows.
int retVal=0;
int err1;
WORD ver=MAKEWORD(2,2);
WSADATA WsaData;
LPHOSTENT hostEnt;
SOCKET clientSock;
SOCKADDR_IN serverInfo;
char szResponse [20*1024];
Функция WndProc будет получать сообщения, которые Windows будет посылать окну. Соответственно, эта функция должна быть объявлена ранее.
DWORD WINAPI ReciverFunction создаёт потоки.
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI ReciverFunction(LPVOID serverSocket);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("KlientWindowsApp");
Дальше мы определяем точку входа программы. Первый параметр - это указатель на саму программу, каждая программа при запуске получает уникальный идентификатор, Второй - должен указывать на экземпляр программы, который был запущен ранее. Следующий параметр - это командная строка, как указатель на последовательность символов, оканчивающихся нулем. Ее извлекать лучше с помощью GetCommandLine(). Последний параметр - это тип отображения окна, то есть совет Windows как окну надо отобразиться.
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
Следующий шаг, это настройка и создание окна, добавление текстовых полей и кнопок.
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BTNSHADOW;
Далее, после создание окна, его нужно проверить на отображение, иначе закрыть программу.
if (!RegisterClassEx (&wincl))
return 0;
После создание и настройки окна переходим к отправке и принятию сообщение. В цикле while ждем сообщение от окна, как появиться новое сообщение, то его отправляем WindowProcedure. Работает цикл, пока функция не вернет 0.
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
Следующим шагом в конструкции switch-case мы выбираем тип подключения, порт, адрес сервера, в случае ошибки при подключении к серверу, так же обрабатываем их и выводим их пользователю.
switch (message)
{
case WM_CREATE:
err1=WSAStartup(ver,(LPWSADATA)&WsaData);
if(err1==SOCKET_ERROR){
MessageBox(hwnd,"Oshibka zagruzki biblioteki","ERROR",0);
}
hostEnt=gethostbyname("localhost");
if(!hostEnt){
MessageBox(hwnd,"Nevozmozhno poluchit imya hosta","ERROR",0);
WSACleanup();
}
clientSock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(clientSock==SOCKET_ERROR){
MessageBox(hwnd, "Nevozmozhno sozdat socet", "ERROR",0);
WSACleanup();
}
serverInfo.sin_family=PF_INET;
serverInfo.sin_addr=*((LPIN_ADDR)*hostEnt->h_addr_list);
serverInfo.sin_port=htons(1111);
retVal=connect(clientSock,(LPSOCKADDR)&serverInfo,sizeof(serverInfo));
if(retVal==SOCKET_ERROR)
{
MessageBox(hwnd,"Soedinit nevozmozho","ERROR",0);
closesocket(clientSock);
WSACleanup();
}
DWORD id;
CreateThread(NULL,0,ReciverFunction,&clientSock,0,&id);
break;
case WM_CLOSE:
closesocket(clientSock);
WSACleanup();
DestroyWindow(hwnd);
break;
case WM_COMMAND:
if((HIWORD(wParam)==0)&&(LOWORD(wParam)==BUTTON_SEND)){
char Message[255];
GetWindowText(MessageEdit,Message,255);
SetWindowText(MessageEdit,"");
retVal=send(clientSock,Message,sizeof(Message),0);
if(retVal==SOCKET_ERROR)
{
MessageBox(hwnd,"Peredacha nevozmozhna","ERROR",0);
WSACleanup();
}
memset(Message,0,sizeof(Message));
}
break;
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
И в конце мы создаём сокет, объявляем массив для сообщения, так же переменную, которая будет хранить длину сообщения, а далее слушаем порт, пока не закроется сокет. Если пришло сообщение, то отправляем его в окно.
SOCKET mysock;
mysock = ((SOCKET*)serverSocket)[0];
char buff[20*1024];
int b_recv;
while ((b_recv=recv(mysock,&buff[0],sizeof(buff),0))&&b_recv!=SOCKET_ERROR)
{
S
memset(buff,0,sizeof(buff));
}
2.2 Приложение сервера
Данное приложение служит для обработки сообщений, либо связывание с другими пользователям
Рисунок 2.2 - Консоль сервера.
Разработка сервера начинается с разработки функции обработки строки.
Функция replas принимает массив, который приходит от клиента и его длинна. Если клиент отправил строку current_clients, то в цикле for вытаскиваем из list всех пользователей и добавляем в строку, а потом преобразуем обратно в массив char и возвращаем пользователю
void replas(char *buff, int recv){
string s = string(buff);
string userT = "СПИСОК ПОДКЛЮЧЕНЫХ:";
if(s=="current_clients"){
for (auto iter = user.begin(); iter != user.end(); iter++) cout " *iter " "\t";
userT += *iter;
userT += " ";
}
strcpy(buff,userT.c_str());
}
}
Далее подключаем и настраиваем сокет. Задаём порт и выбираем режим работы.
WSADATA WsaData;
u_short Port=1111;
SOCKET socket_server;
SOCKET socket_client;
sockaddr_in local_addr;
sockaddr_in client_addr;
int client_count;
char Exit;
Если есть новое соединение, то присваиваем его сокету, создаём массив для хранения сообщения, переменную, для хранения длинны сообщения, а так же отправляем клиенту сообщение о удачном подключении к серверу.
SOCKET mysock;
mysock=((SOCKET*) client_socket)[0];
char buff[20*1024];
int b_recv;
string S="Доступ разрешен!\n";
send(mysock,S.c_str(),S.length()+1,0);
Далее слушаем сообщения от клиента, если есть новое сообщение, то записываем его в массив, отправляем его в нашу созданную функцию по обработке строк, после обработки отправляем его обратно клиенту.
while((b_recv=recv(mysock,&buff[0],sizeof(buff),0))&&b_recv!=SOCKET_ERROR)
{
if(buff[0]==0x1B) break;
replas(buff, b_recv);
send(mysock,&buff[0],b_recv,0);
}
Если какой то из пользователей отключился от сервера, то выводим в консоль сервера соответствующую информацию.
client_count--;
cout " "Разрыв соединения: " " client_count " " пользователей подключено." " endl;
closesocket(mysock);
return 0;
Данная функция является потоком, которая ожидает запрос соединение от клиента к серверу. Инкриментируем количество подключенных пользователей, записываем IP подключаемого пользователя и выводим в консоль соответствующую информацию.
DWORD WINAPI AsseptFunction(LPVOID serv_socket)
{
int client_addr_size=sizeof(client_addr);
while((socket_client=accept(((SOCKET*)serv_socket)[0],(sockaddr*) &client_addr,
&client_addr_size)))
{
client_count++;
HOSTENT *host;
host=gethostbyaddr((char*) &client_addr.sin_addr.s_addr,4,AF_INET);
string string_msg=(const char*)host->h_name;
cout " "Новое соединение: "+string_msg " endl;
cout " client_count " " пользователей подключено." " endl;
DWORD id;
CreateThread(NULL,0,ClientFunction,&socket_client,0,&id);
}
return 0;
}
Проверяем загрузку библиотеки winsock, если возникла ошибка то выводим ее в консоль сервера.
int main()
{
setlocale (0, "rus");
int err=WSAStartup(0x0202,&WsaData);
if(err==SOCKET_ERROR)
{
cout " "Ошибка загрузки библиотеки winsock: "+WSAGetLastError() "
endl;
return 1;
}
else
{
cout " "Загрузка библиотеки прошла успешно." " endl;
Создаём сокет, если возникает ошибка то выводим её в консоль, если всё прошло удачно то связываем сокет с адресом.
socket_server=socket(AF_INET,SOCK_STREAM,0);
if(socket_server==INVALID_SOCKET)
{
cout " "Невозможно создать сокет: "+WSAGetLastError();
WSACleanup();
return 1;
}
else
{
local_addr.sin_family=AF_INET;
local_addr.sin_port=htons(Port);
local_addr.sin_addr.s_addr=0;
Если сокет связался с портом удачно, то далее переходим в режим прослушивания
if(listen(socket_server,0x05))
{
cout " "Невозможно прослушивать порт" " endl;
closesocket(socket_server);
WSACleanup();
return 1;
}
}
cout " "Ожидается соединение..." " endl;
}
В данном коде мы создаем поток сервера, а так же обрабатываем нажатие клавиш клавиатуры для остановки сервера.
CreateThread(NULL,0,AsseptFunction,&socket_server,0,&id1);
cout " "Процесс пошел!" " endl;
cout " "Для остановки сервера нажмите Esc" " endl;
//Бесконечный цикл сервера
while(true)
{
Exit=getch();
if(Exit==0x1B)
{
cout " "Остановка сервера " " endl;
break;
}
}
closesocket(socket_server);
WSACleanup();
cout " "Сервер остановлен." " endl;
return 0;
}
3. Демонстрация работы связки программы клиент-сервера
В ходе разработки сервера, была создана функция, выполняющая по запросу пользователя "id_clients" возврат id всех подключенных к серверу клиентов.
Рисунок 3.1 - запуск сервера.
Рисунок 3.2 - запуск приложения "Клиент"
Рисунок 3.3 - передача имени в приложение "Клиент"
Рисунок 3.4 - запуск функции в приложении "Клиент"
Рисунок 3.5 - результат работы функции
Заключение
Данная курсовая работа помогает закрепить полученные знания на протяжения всего курса обучения, улучшить навыки решения поставленных задач, дает возможность научиться поиску необходимой информации для облегчения решения поставленной задачи. Решение задач в объеме курсовой работы по курсу "Информационные технологии" закрепляет теоретические и практические знания и навыки самостоятельного решения. Поставленная цель достигнута с изучением библиотеки winsock. В процессе решения поставленных задач изучались и анализировались следующие дисциплинарные темы:
* создание сокета;
* настройка сокета;
* разработка полноценного приложения сервера с использованием сокета
* разработка приложения для пользователя;
* обработка строк.
Список использованных источников
1. А.Ю. Молчанов. Системное программное обеспечение: Учебник для ВУЗов. 3-е изд. - СПБ.: Питер, 2010. - 400 с. : ил.
2. А.Ю. Молчанов. Системное программное обеспечение. Лабораторный практикум. - СПБ.: Питер, 2005. - 284 с. : ил.
3. Робин Хантер Основные концепции компиляторов = The Essence of Compilers. - М.: "Вильямс", 2002. - С. 256. - ISBN 5-8459-0360-2
4. Ашарина, И.В. Основы программирования на языках С и С++: Курс лекций для высших учебных заведений / И.В. Ашарина. - М.: Гор. линия-Телеком, 2012. - 208 c.
5. Страуступ, Б. Язык программирования С++. Специальное издание / Б. Страуступ. - М.: Бином, 2015. - 1136 c.
6. Фридман, А.Л. Основы объектно-ориентированного программирования на языке Си++ / А.Л. Фридман. - М.: Гор. линия-Телеком, 2012. - 234 c.
7. Гавриков, М.М. Теоретические основы разработки и реализации языков программирования: Учебное пособие / М.М. Гавриков, А.Н. Иванченко, Д.В. Гринченков. - М.: КноРус, 2010. - 184 c.
Приложение А.
Программа сервер
#include <iostream>
#include <winsock2.h>
#include <conio.h>
#include <list>
using namespace std;
WSADATA WsaData;
u_short Port=1111;
SOCKET socket_server;
SOCKET socket_client;
sockaddr_in local_addr;
sockaddr_in client_addr;
int client_count;
char Exit;
// list
list <string> user;
void replas(char *buff, int recv){
string s = string(buff);
string userT = "СПИСОК ПОДКЛЮЧЕНЫХ:";
if(s=="current_clients"){
for (auto iter = user.begin(); iter != user.end(); iter++)
{
//cout " *iter " "\t";
userT += *iter;
userT += " ";
}
strcpy(buff,userT.c_str());
}
}
DWORD WINAPI ClientFunction(LPVOID client_socket)
{
SOCKET mysock;
char buff[20*1024];
int b_recv;
mysock=((SOCKET*) client_socket)[0];
string name;
string S="Доступ разрешен!\n ВВЕДИТЕ ВАШЕ ИМЯ!";
send(mysock,S.c_str(),S.length()+1,0);
Sleep(10);
S="Доступ разрешен!\n ВВЕДИТЕ ВАШЕ ИМЯ!";
send(mysock,S.c_str(),S.length()+1,0); while((b_recv=recv(mysock,&buff[0],sizeof(buff),0))&&b_recv!=SOCKET_ERROR) // слушаем имя
{
if(buff[0]==0x1B) break;
name = string(buff);
string S="Здавствуйте, " + name + "!";
send(mysock,S.c_str(),S.length()+1,0);
user.push_back(name);
cout""Новое соеденение: " " name " endl;
break;
}
while((b_recv=recv(mysock,&buff[0],sizeof(buff),0))&&b_recv!=SOCKET_ERROR)
{
if(buff[0]==0x1B) break;
replas(buff, b_recv);
send(mysock,&buff[0],b_recv,0);
}
client_count--;
cout " "Разрыв соединения: " " name " endl;
closesocket(mysock);
for (auto iter = user.begin(); iter != user.end(); iter++)
{
if(*iter==name){
user.remove(*iter);
break;
}
}
return 0;
}
DWORD WINAPI AsseptFunction(LPVOID serv_socket)
{
int client_addr_size=sizeof(client_addr);
while((socket_client=accept(((SOCKET*)serv_socket)[0],(sockaddr*) &client_addr,
&client_addr_size)))
{
client_count++;
HOSTENT *host;
host=gethostbyaddr((char*) &client_addr.sin_addr.s_addr,4,AF_INET);
string string_msg=(const char*)host->h_name;
//////
//cout " "Новое соединение: "+string_msg " endl;
cout " client_count " " пользователей подключено." " endl;
DWORD id;
CreateThread(NULL,0,ClientFunction,&socket_client,0,&id);
}
return 0;
}
int main()
{
setlocale (0, "rus");
//инициализация библиотеки winsock
int err=WSAStartup(0x0202,&WsaData);
if(err==SOCKET_ERROR)
{
cout " "Ошибка загрузки библиотеки winsock: "+WSAGetLastError() "
endl;
return 1;
}
else
{
cout " "Загрузка библиотеки прошла успешно." " endl;
}
//Создаем сокет
socket_server=socket(AF_INET,SOCK_STREAM,0);
if(socket_server==INVALID_SOCKET)
{
cout " "Невозможно создать сокет: "+WSAGetLastError();
WSACleanup();
return 1;
}
else
{
//связываем соект с адресом
local_addr.sin_family=AF_INET;
local_addr.sin_port=htons(Port);
local_addr.sin_addr.s_addr=0;
if(bind(socket_server,(sockaddr*) &local_addr,sizeof(local_addr)))
{
cout " "Не удается установить связь" " endl;
closesocket(socket_server);
WSACleanup();
return 1;
}
else
{
//связали сокет и порт удачно, переходим в режим прослушивания
if(listen(socket_server,0x05))
{
cout " "Невозможно прослушивать порт" " endl;
closesocket(socket_server);
WSACleanup();
return 1;
}
}
cout " "Ожидается соединение..." " endl;
}
DWORD id1;
CreateThread(NULL,0,AsseptFunction,&socket_server,0,&id1);
cout " "Процесс пошел!" " endl;
cout " "Для остановки сервера нажмите Esc" " endl;
//Бесконечный цикл сервера
while(true)
{
Exit=getch();
if(Exit==0x1B)
{
cout " "Остановка сервера " " endl;
break;
}
}
closesocket(socket_server);
WSACleanup();
cout " "Сервер остановлен." " endl;
return 0;
}
Приложение Б.
Программа клиент
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>
int retVal=0;
int err1;
WORD ver=MAKEWORD(2,2);
WSADATA WsaData;
LPHOSTENT hostEnt;
SOCKET clientSock;
SOCKADDR_IN serverInfo;
char szResponse [20*1024];
#define EDIT_MESSAGE 1001
#define EDIT_TEXT 1002
#define BUTTON_SEND 1003
HWND MessageEdit;
HWND TextEdit;
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI ReciverFunction(LPVOID serverSocket);
/* Make the class name into a global variable */
TCHAR szClassName[ ] = _T("KlientWindowsApp");
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
/* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BTNSHADOW;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
_T("Prilozhenie - client"), /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
MessageEdit=CreateWindowEx(WS_EX_CLIENTEDGE,"edit",NULL,WS_VISIBLE|WS_CHILD|BS_RIGHT|WS_VSCROLL|ES_AUTOVSCROLL|ES_MULTILINE,10,30,514,120,hwnd,(HMENU)EDIT_MESSAGE,hThisInstance,NULL);
//??????? ?????? ????????
TextEdit=CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL,WS_VISIBLE|WS_CHILD|BS_RIGHT|WS_VSCROLL|ES_AUTOVSCROLL|ES_MULTILINE,10,160,514,100,hwnd,(HMENU)EDIT_TEXT,hThisInstance,NULL);
/* Make the window visible on the screen */
CreateWindow (TEXT("button"), TEXT("Peredat"),WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,10,290,514,27,hwnd,(HMENU)BUTTON_SEND,hThisInstance,NULL);
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
err1=WSAStartup(ver,(LPWSADATA)&WsaData);
if(err1==SOCKET_ERROR){
MessageBox(hwnd,"Oshibka zagruzki biblioteki","ERROR",0);
}
hostEnt=gethostbyname("localhost");
if(!hostEnt){
MessageBox(hwnd,"Nevozmozhno poluchit imya hosta","ERROR",0);
WSACleanup();
} clientSock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(clientSock==SOCKET_ERROR){
MessageBox(hwnd, "Nevozmozhno sozdat socet", "ERROR",0);
WSACleanup();
}
serverInfo.sin_family=PF_INET;
serverInfo.sin_addr=*((LPIN_ADDR)*hostEnt->h_addr_list);
serverInfo.sin_port=htons(1111);
retVal=connect(clientSock,(LPSOCKADDR)&serverInfo,sizeof(serverInfo));
if(retVal==SOCKET_ERROR)
{
MessageBox(hwnd,"Soedinit nevozmozho","ERROR",0);
closesocket(clientSock);
WSACleanup();
}
DWORD id;
CreateThread(NULL,0,ReciverFunction,&clientSock,0,&id);
break;
case WM_CLOSE:
closesocket(clientSock);
WSACleanup();
DestroyWindow(hwnd);
break;
case WM_COMMAND:
if((HIWORD(wParam)==0)&&(LOWORD(wParam)==BUTTON_SEND)){
char Message[255];
GetWindowText(MessageEdit,Message,255);
SetWindowText(MessageEdit,"");
retVal=send(clientSock,Message,sizeof(Message),0);
if(retVal==SOCKET_ERROR)
{
MessageBox(hwnd,"Peredacha nevozmozhna","ERROR",0);
WSACleanup();
}
memset(Message,0,sizeof(Message));
}
break;
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
/* All other messages (a lot of them) are processed using default procedures */
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
DWORD WINAPI ReciverFunction(LPVOID serverSocket)
{
SOCKET mysock;
mysock = ((SOCKET*)serverSocket)[0];
char buff[20*1024];
int b_recv;
while ((b_recv=recv(mysock,&buff[0],sizeof(buff),0))&&b_recv!=SOCKET_ERROR)
{
SetWindowText(TextEdit,buff);
memset(buff,0,sizeof(buff));
}
}
Размещено на Allbest.ru
...Подобные документы
Архитектура клиент-сервер на основе сокетов Windows. Описание утилиты Ipconfig. Конфигурирование стека TCP/IP. Реализация сокетов через классы NET. Структура библиотечных и пользовательских классов. Схема интерфейса пользователя и работы приложения.
курсовая работа [419,5 K], добавлен 13.12.2012Характеристика виртуальной образовательной среды Unity. Особенности трехмерной виртуальной образовательной среды, как рабочего места пользователя. Организация взаимодействия пользователя с виртуальной рабочей средой факультета с использованием скриптов.
курсовая работа [373,7 K], добавлен 22.08.2013Разработка программы типа клиент-сервер на языке программирования Python, являющейся автоматическим сервисом поиска контактной информации о пользователях. Применение дейтаграммных и потоковых сокетов. Блок-схема работы программы, руководство пользователя.
курсовая работа [222,0 K], добавлен 24.04.2015Разработка программы FTP-клиент, которая может подключаться к серверу в активном и пассивном режимах, используя имя пользователя и пароль; скачивать, загружать и удалять файлы с сервера. Протоколы прикладного и транспортного уровней. Описание интерфейса.
курсовая работа [149,2 K], добавлен 07.07.2013Основные правила разработки интерфейса пользователя. Создание базы данных с использованием разработанных моделей. Кодирование модулей программной системы с целью создания прототипа. Первичное окно при запуске программы. Защита от потери информации.
лабораторная работа [857,8 K], добавлен 13.06.2014Разработка компьютерной программы, которая реализует игру "Арканоид". Освоение приемов программирования на языке С++ с использованием средств OpenGL, разбор структуры и логики игры, приобретение навыков работы с 3D графикой. Руководство пользователя.
курсовая работа [1,2 M], добавлен 02.03.2017Модель процесса обработки информации на персональном компьютере и функции объектов, участвующих в этом процессе – операционной системы, прикладных программ, пользователя. Интерфейсные элементы и практические навыки работы с мышью, окнами, программами.
контрольная работа [557,9 K], добавлен 09.03.2011Изучение средств распараллеливания, предоставляемых технологиями OpenMP. Исследование синтаксиса и семантики функций технологии OpenMP на языке программирования Visual C++). Проектирование интерфейса пользователя для взаимодействия с программой.
контрольная работа [773,9 K], добавлен 12.07.2015Понятие "Интернет" и его роль в современном мире. Понятие протоколов сетевого взаимодействия. Схема потока данных сквозь стек протоколов от приложения-клиента на одном компьютере к приложению-серверу на другом. Основные элементы технологии WWW.
презентация [248,0 K], добавлен 19.09.2016Анализ сервисов отслеживания почты. Технология построения интерактивного интерфейса пользователя. Определение стран отправителя и назначения. Распознавание CAPTCHA трекингов почты России и Китая. Добавление и удаление трек-кода в список пользователя.
дипломная работа [5,6 M], добавлен 10.06.2013Программирование приложения с использованием библиотеки OpenGL и функции для рисования геометрических объектов. Разработка процедуры визуализации трехмерной сцены и интерфейса пользователя. Логическая структура и функциональная декомпозиция проекта.
курсовая работа [1,1 M], добавлен 23.06.2011Анализ средств распараллеливания, предоставляемых технологиями OpenMP. Синтаксис и семантика функций технологии OpenMP на языке программирования Visual C++. Компиляция программы, проектирование интерфейса пользователя для взаимодействия с программой.
курсовая работа [492,0 K], добавлен 09.08.2015Создание сетевой системы тестирования с целью автоматизации процесса контроля знаний, оценивания результатов и создания тестовых заданий. Файлы проекта и их назначение. Описание алгоритмов и модулей программы. Работа с сетью, руководство пользователя.
контрольная работа [928,3 K], добавлен 23.12.2012Программный комплекс автоматизации телефонных соединений. Разработка графического интерфейса пользователя, технологической инструкции для пользователя программы, контроля и аттестации программ. Расчет затрат при автоматизации телефонных соединений.
дипломная работа [4,7 M], добавлен 15.10.2013Функциональные зависимости и нормализация отношений. Ограничения целостности данных. Описание таблиц на языке SQL. Интерфейс пользователя и надёжность программ обработки данных. Обработка данных с помощью запросов. Работа с данными из внешних источников.
дипломная работа [1,6 M], добавлен 25.04.2015Разработка приложения, автоматизирующего процесс синхронизации файлов между сменным носителем и каталогом на другом диске. Классы для работы с файловой системой. Интерфейс программы и способы взаимодействия пользователя с ним. Создание новой синхропары.
курсовая работа [632,0 K], добавлен 21.10.2015Проектирование баз данных в интерфейсе пользователя Microsoft Access. Способы создания форм и запросов. Этапы разработки базы данных "Детского сада", которая может применяться для упрощения работы, сортировки фамилий, номеров группы, возраста детей.
курсовая работа [2,1 M], добавлен 17.12.2014Разработка проекта системы, программы, интерфейса взаимодействия пользователя с системой. Программная база для реализации проекта "Электронная администрация". Создание удобной среды для пользователей системы. Разработка форм входных и выходных данных.
дипломная работа [3,9 M], добавлен 20.06.2012Перечень клеточных интермедиатов, ферментов, кофакторов, заболеваний, входящих в систему "Биоинженерия". Построение кинетической схемы метаболической системы, определяющей взаимодействия между веществами в программе MVS c использованием 2D анимации.
дипломная работа [1,0 M], добавлен 11.10.2013Сетевое программное обеспечение: общее понятие, содержание, функции. Этапы развития теории компьютерных сетей. Проектирование в среде программирования Borland Builder C++ клиент серверного приложения с использованием сокетов, листинг данной программы.
курсовая работа [191,5 K], добавлен 07.01.2015