Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Лаб6.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
361.98 Кб
Скачать

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

Для виконання завдання створити нове рішення (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 чат буде завершено.