Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Хід виконання роботи.

Читайте также:
  1. Аналіз балансу виконання кошторису витрат
  2. Варіанти для індивідуальної роботи.
  3. Вибір варіанту для виконання завдання
  4. ВИКОНАННЯ ІНДИВІДУАЛЬНОГО ДОМАШНЬОГО ЗАВДАННЯ
  5. Виконання курсової роботи
  6. ВИКОНАННЯ ПРАКТИЧНИХ НАВИЧОК
  7. Виконання спеціального завдання з розкриття злочинної діяльності організованої групи чи злочинної організації

Для виконання завдання створити нове рішення (Solution). У цьому рішенні створити два нові проекти: перший назвати Server, а другий – Client.

Скопіювати у проекти відповідні програми.

 

Сервер:

// Server.cpp: Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

#include <winsock2.h>

 

#pragma comment(lib, "ws2_32.lib")

 

int _tmain(int argc, _TCHAR* argv[])

{

// буфер для вхідних повідомлень

char inBuf[30];

 

// буфер для вихідних повідомлень

char outBuf[30];

 

// ініціалізація бібліотети сокетів

WSAData wsa;

WORD Version = MAKEWORD(2, 1);

WSAStartup(Version, &wsa);

 

// сокет для прослуховування каналу зв"язку

SOCKET Listen = socket(AF_INET, SOCK_STREAM, NULL);

// сокет для зв"язку з клієнтом

SOCKET Connect = socket(AF_INET, SOCK_STREAM, NULL);

 

// структура для зберігання інформації про з"єднання (ІР-адреса, протокол)

SOCKADDR_IN Server;

 

// інформація про з"єднання

Server.sin_addr.s_addr = inet_addr("127.0.0.1"); // адреса сервера (127.0.0.1 - локальна адреса)

Server.sin_family = AF_INET; // використовуються адреси протоколу ІРv4

Server.sin_port = htons(25252); // порт

 

// встановлення з"єднання

bind(Listen, (SOCKADDR*)&Server, sizeof(Server));

 

// початок прослуховування каналу зв"язку

listen(Listen, 1);

 

cout << "\nWaiting for connection...\n";

 

int size = sizeof(Server);

bool isClosed = false; // змінна, яка показує, чи завершено розмову

 

// в нескінченному циклі очікуємо на з"єднання з клієнтом

while (true)

{

// встановлення з"єднання з клієнтом

if(Connect = accept(Listen, (SOCKADDR*)&Server, &size))

{

 

cout << "\nConnection to client is OK!\n\n";

 

// обмін повідомленнями з клієнтом

while(true)

{

cout << "Server: ";

 

// зчитування повідомлення від користувача

cin.getline(outBuf, sizeof(outBuf));

 

// відправка повідомлення клієнту

send(Connect, outBuf, sizeof(outBuf), 0);

// якщо введено "close", то завершуємо сесію

if (strcmp(outBuf, "close") == 0)

{

cout << "Connection closed\n";

isClosed = true;

break;

}

 

// очікування одержання повідомлення від клієнта

recv(Connect, inBuf, sizeof(inBuf), 0);

 

// якщо від клієнта одержано "close", то завершуємо сесію

if (strcmp(inBuf, "close") == 0)

{

cout << "Connection closed\n";

isClosed = true;

break;

}

cout << "Client: " << inBuf << '\n';

// зчитування зайвих символів,

while(_kbhit()) {_getch();}

}

}

if (isClosed) break;

}

 

cout << "\nEnd of session.\n";

 

// завершення роботи з сокетами

WSACleanup();

_getch();

 

return 0;

}

 

 

Клієнт:

// Client.cpp: Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

#include <winsock2.h>

 

#pragma comment(lib, "ws2_32.lib")

 

int _tmain(int argc, _TCHAR* argv[])

{

char inBuf[30];

char outBuf[30];

 

WSAData wsa;

WORD Version = MAKEWORD(2, 1);

WSAStartup(Version, &wsa);

 

SOCKET Connect = socket(AF_INET, SOCK_STREAM, NULL);

 

SOCKADDR_IN Client;

 

Client.sin_addr.s_addr = inet_addr("127.0.0.1");

Client.sin_family = AF_INET;

Client.sin_port = htons(25252);

 

cout << "\nPress enter to connect to server...\n";

_getch();

 

bool isClosed = false;

while (true)

{

if(connect(Connect, (SOCKADDR*)&Client, sizeof(Client)))

{

while (true)

{

recv(Connect, inBuf, sizeof(inBuf), 0);

if (strcmp(inBuf, "close") == 0)

{

cout << "Connection closed\n";

isClosed = true;

break;

}

cout << "Server: " << inBuf << '\n';

while(_kbhit()) {_getch();}

cout << "Client: ";

cin.getline(outBuf, sizeof(outBuf));

send(Connect, outBuf, sizeof(outBuf), 0);

if (strcmp(outBuf, "close") == 0)

{

cout << "Connection closed\n";

isClosed = true;

break;

}

}

if (isClosed) break;

}

 

}

 

cout << "\nEnd of session.\n";

_getch();

 

WSACleanup();

 

return 0;

}

 

Створити ехе-файли проектів:

Build – Build Solution.

Запуск програм:

- зайти у папку проекту.

- відкрити папку Debug.

- запустити ехе-файли: Server.exe та Client.exе.

 

Результат роботи програми.

 

Можливий діалог:

При введенні слова close чат буде завершено.

 

Завдання для індивідуальної роботи.

Задача 1. Доповнити програму можливістю перевірки клієнта. При запиті на з’єднання клієнт має відправити на сервер свій логін. Якщо відправлений логін співпадає з записаним на сервері, то чат відкривається, інакше роботу завершено.

Для обміну повідомленнями використати функції send() та recv(). Для перевірки співпадіння логіну використати функцію strcmp().

 

Задача 2. Доповнити програму виведенням часу одержання повідомлення.

Використати код:

SYSTEMTIME st;

GetLocalTime(&st);

std::cout << st.wHour << ':'

<< st.wMinute << ':'

<< st.wSecond << '.'

<< st.wMilliseconds << '\n';

Підключити файл #include <windows.h>.

 


Дата добавления: 2015-10-02; просмотров: 56 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Теоретичні відомості.| Общие сведения о реестре ОС Microsoft Windows

mybiblioteka.su - 2015-2024 год. (0.012 сек.)