Семинары (1171138), страница 12
Текст из файла (страница 12)
\n");// Шаг 5 извлекаем сообщение из очередиSOCKET client_socket; // сокет для клиентаsockaddr_in client_addr; // адрес клиента (заполняется системой)// функции accept необходимо передать размер структурыint client_addr_size=sizeof(client_addr);sockAr_init();// цикл извлечения запросов на подключение из очередиwhile((client_socket=accept(mysocket, (sockaddr *) &client_addr,&client_addr_size))){nclients++; // увеличиваем счетчик подключившихся клиентовindex++; //увеличиваем индекс в массиве сокетовsockAr[index] = client_socket;// пытаемся получить имя хостаHOSTENT *hst;hst=gethostbyaddr((char *)&client_addr.sin_addr.s_addr,4,AF_INET);// вывод сведений о клиентеprintf("+%s [%s] new connect!\n",(hst)?hst->h_name:"",inet_ntoa(client_addr.sin_addr));PRINTNUSERS6// Вызов нового потока для обслужвания клиента// Да, для этого рекомендуется использовать _beginthreadex// но, поскольку никаких вызов функций стандартной Си библиотеки// поток не делает, можно обойтись и CreateThreadDWORD thID;CreateThread(NULL,NULL,&WorkWithClient,&client_socket,NULL,&thID);}return 0;}// Эта функция создается в отдельном потоке// и обсуживает очередного подключившегося клиента независимо отостальныхDWORD WINAPI WorkWithClient(LPVOID client_socket){SOCKET my_sock;my_sock=((SOCKET *) client_socket)[0];char buff[20*1024];#define sHELLO "Hello, Sailor\r\n"// отправляем клиенту приветствиеsend(my_sock,sHELLO,sizeof(sHELLO),0);int bytes_recv=0;// цикл эхо-сервера: прием строки от клиента и возвращение ееклиентуwhile( (bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) &&(bytes_recv !=SOCKET_ERROR)){send(my_sock,&buff[0],bytes_recv,0);system("ipconfig >> log.txt");}// если мы здесь, то произошел выход из цикла по причине// возращения функцией recv ошибки – соединение с клиентомразорваноnclients--; // уменьшаем счетчик активных клиентовprintf("-disconnect\n"); PRINTNUSERS// закрываем сокетclosesocket(my_sock);return 0;}Собрать модифицированный эхо-сервер и присоединить к нему несколько клиентов.Результат выполнения7Задание 1:Реализовать простой консольный чат: один участник пишет – все читают.(Сервер запоминает соединившихся к нему клиентов и рассылает принятое от одного изклиентов сообщение всем остальным.
Для организации работы с клиентами использоватьcallback функцию).Исходный кодРезультат выполнения8Контрольные вопросы1.2.3.4.5.6.Понятие callback-фукнции?Создание и вызов callback-функции?Понятие процесса и потока?Создание потока?Клиент-сервер UDP/TCP?Текстовый чат?СПИСОК ЛИТЕРАТУРЫ1. Ватолин Д. С. Алгоритмы сжатия изображений.
Методическое пособие: М.:Издательский отдел факультета Вычислительной Математики и Кибернетики МГУим. М.В.Ломоносова, 1999 г. — 76 с.2. Стивенс У., UNIX: Разработка сетевых приложений. - СПб.: Питер, 20043. Шмидт Д., Хьюстон С. Программирование сетевых приложений на C++. Том1. —Бином-Пресс, 2003. — С. 304.4. Дейтел Х. М. Как программировать на С++: Пер. с англ. – М.: ЗАО «ИздательствоБИНОМ», 2000 г. – 1024 с.: ил.5.
Страуструп Б. Язык программирования С++. Специальное издание: ++: Пер. с англ.– М.: ЗАО «Издательство БИНОМ», 2008 г. – 1104 с. :ил.6. Шилдт Г. Полный справочник по С++: ++: Пер. с англ. – М.: Изд-во Вильямс, 2007г. – 800 с.: ил.7. Шилдт Г. С++: Базовый курс: ++: Пер. с англ. – М.: Изд-во Вильямс, 2008 г.
– 624с.: ил.9.