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