Задание. Создать клиент-серверное приложение (простейший эхо-сервер + клиент), работающее по протоколу TCP, с помощью сокетов. Предлагается на выбор реализация на языках С# (вариант 1) или C (вариант 2).
Порядок выполнения работы.
1. Создать 2 (два) консольных проекта и поместить туда представленный ниже код сервера и код клиента.
2. Запустить сначала сервер.
3. Потом запускать клиентов.
4. Убедиться, что все работает.
5. Потом в режиме отладки (по шагам) смотреть как работает сервер и как работает клиент. Понять, в какие моменты происходит зависание программы.
6. В отчете с титульным листом предоставьте файл с описанием работы сервера и клиента, скриншот работы простейшего приложения, использующего сокеты. Должно быть видно окно клиента и сервера на одном рисунке.
Вариант 1.
Исходный код сервера на языке C#.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketTcpServer
{
class Program
{
static int port = 8005; // порт для приема входящих запросов
static void Main(string[] args)
{
String Host = Dns.GetHostName();
Console.WriteLine(«Comp name = » + Host);
IPAddress[] IPs;
IPs=Dns.GetHostAddresses(Host);
foreach (IPAddress ip1 in IPs)
Console.WriteLine(ip1);
//получаем адреса для запуска сокета
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(«127.0.0.1»), port);
// создаем сокет сервера
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// связываем сокет с локальной точкой, по которой будем принимать данные
listenSocket.Bind(ipPoint);
// начинаем прослушивание
listenSocket.Listen(10);
Console.WriteLine(«Сервер запущен. Ожидание подключений…»);
while (true)
{
Socket handler = listenSocket.Accept(); // сокет для связи с клиентом
// готовимся получать сообщение
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байтов за 1 раз
int kol_bytes = 0;//количество полученных байтов
byte[] data = new byte[255]; // буфер для получаемых данных
do
{
bytes = handler.Receive(data); // получаем сообщение
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
kol_bytes += bytes;
}
while (handler.Available > 0);
Console.WriteLine(DateTime.Now.ToShortTimeString() + «: » + builder.ToString());
Console.WriteLine(kol_bytes+»bytesn»);
// отправляем ответ
string message = «ваше сообщение доставлено»;
// закрываем сокет
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Исходный код клиента на языке C#.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketTcpClient
{
class Program
{
// адрес и порт сервера, к которому будем подключаться
static int port = 8005; // порт сервера
static string address = «127.0.0.1»; // адрес сервера
static void Main(string[] args)
{
try
{ //создаем конечную точку
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
//создаем сокет
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// подключаемся к удаленному хосту
socket.Connect(ipPoint);
StringBuilder builder = new StringBuilder();
Console.Write(«Введите сообщение:»);
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
//посылаем сообщение
socket.Send(data);
// готовимся получить ответ
data = new byte[256]; // буфер для ответа
int bytes = 0; // количество полученных байт
// получаем ответ
do
{
bytes = socket.Receive(data, data.Length, 0);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (socket.Available > 0);
Console.WriteLine(«ответ сервера: » + builder.ToString());
// закрываем сокет
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}
Вариант 2.
Исходный код сервера на языке C.
using namespace std;
#include
#include
#include
#include
#pragma comment(lib, «Ws2_32.lib»)
#define SERVER_PORT 3817
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_CTYPE, «Russian»); // включаем русскую кодировку
struct sockaddr_in SrvAddr; // Адресная структура сервера
struct sockaddr_in ConnAddr; // Адресная структура клиента
SOCKET SrvSock, Conn;
WSADATA wsaData; // для работы Windows с сокетами
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult
