АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Текст програми

Читайте также:
  1. Creating a VHDL Source (создание файла, содержащего текст программы на языке VHDL).
  2. Ex.4. Using new vocabulary retell the text. / Використовуючи нову лексику перекажіть текст.
  3. Ex.5. Using new vocabulary retell the text. / Використовуючи нову лексику перекажіть текст (впр.2).
  4. Ex.6. Using new vocabulary retell the text. / Використовуючи нову лексику перекажіть текст.
  5. HTML - Урок 3. Форматирование текста
  6. II.2 Стилистическая характеристика рекламного текста
  7. MS Excel.Текстовые функции, примеры использования текстовых функций.
  8. The subject title (Заголовок к тексту)
  9. V2: Текстовые редакторы.
  10. V2: Текстовые редакторы. Пользовательский интерфейс MS WORD.
  11. V2: Текстовые редакторы. Таблицы.
  12. А) структура текстів драм

Опис протоколу

Эхо-сервис весьма полезен для отладки и выполнения измерений. Этот сервис просто возвращает отправителю любые данные, полученные от него.

Службы Echo на базе протокола TCP

Один из вариантов эхо-сервиса определен как основанное на организации соединений приложение TCP. Эхо-сервер прослушивает соединения TCP на порту 7. После организации соединения все полученные через это соединение данные возвращаются отправителю. Процесс возврата полученных данных отправителю продолжается до тех пор, пока инициатор соединения не разорвет это соединение.

Службы Echo на базе протокола UDP

Другой вариант эхо-сервиса не использует прямых соединений и основан на передаче дейтаграмм UDP. Эхо-сервер прослушивает порт 7 (UDP) и возвращает отправителю все принятые через этот порт дейтаграммы.

Узагальнений алгоритм тестування системи

1. Сервер надсилає повідомлення клієнту

2. Клієнт отримує повідомлення сервера та відсилає відповідь

3. Сервер отримує відповідь клієнта

Пооператорна (дослівна) схема алгоритма програми з її фрагментами

Сервер:

1.Ініціалізація бібліотеки сокету

iError = WSAStartup(MAKEWORD(2,2), &t_wsa); // Start the WSADATA

 

2.Створення сокету сервера

sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 

3.Заповнення структури інформацією о сокеті

sinServer.sin_family = AF_INET;

sinServer.sin_addr.s_addr = INADDR_ANY; // IP, INADDR_ANY means current IP

sinServer.sin_port = htons(7); // Port

4.Зв’язуємо інформацію структури з сокетом сервера

if(bind(sServer, (LPSOCKADDR)&sinServer, sizeof(sinServer)) == SOCKET_ERROR)

...

 

5.Очикуємо підключення до клієнту

sClient = accept(sServer, (LPSOCKADDR)&sinServer, &szlength);

 

6.Надсилаємо повідомлення клієнту

iRet = send(sClient, buffer, 49, 0);//sending message to client

 

7.Приймаємо відповідь клієнта

iRet = recv(sClient, cClientMessage, strlen(cClientMessage), 0);

...

 

Клієнт:

1.Ініціалізація бібліотеки сокету

iError = WSAStartup(MAKEWORD(2,2), &t_wsa); // Start the WSADATA

 

2.Створення сокету клієнта

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 

3.Заповнення структури (інформація о сервері)

char cIP[50];

strcpy(cIP, "127.0.0.1");

sinClient.sin_family = AF_INET;

sinClient.sin_addr.s_addr = inet_addr(cIP);

sinClient.sin_port = htons(7);

 

4.Робимо зв'язок з сервером

if(connect(sClient, (LPSOCKADDR)&sinClient, sizeof(sinClient)) == SOCKET_ERROR)

 

5.Надсилаємо серверу повідомлення

iRet = send(sClient, buffer, 49, 0);

 

6.Отримуємо повідомлення від сервера

iRet = recv(sClient, cServerMessage, strlen(cServerMessage), 0);

 

Практична частини

 

Текст програми

 

--------------------------------------------------Сервер--------------------------------------------------

#include <winsock2.h>

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

 

int main(int argc, char *argv[])

{

WSADATA t_wsa; // WSADATA structure

int iError; // error number

 

// Initialize Winsock

iError = WSAStartup(MAKEWORD(2,2), &t_wsa); // Start the WSADATA

 

if(iError!= NO_ERROR)

{

printf("Error at WSAStartup()\n");

WSACleanup();

return 0;

}

 

SOCKET sServer;

 

//AF_INET - The Internet Protocol version 4 (IPv4) address family.

//SOCK_STREAM - two-way, connection-based byte streams

//IPPROTO_TCP - The Transmission Control Protocol (TCP).

 

sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sServer == INVALID_SOCKET || iError == 1)

{

printf("Invalid Socket!\n");

WSACleanup();

return 0;

}

 

//used by Windows Sockets to specify a local or remote endpoint

SOCKADDR_IN sinServer;

 

//address to which to connect a socket.

 

memset(&sinServer, 0, sizeof(sinServer));

 

sinServer.sin_family = AF_INET;

sinServer.sin_addr.s_addr = INADDR_ANY; // IP, INADDR_ANY means current IP

sinServer.sin_port = htons(7); // Port

 

//Now we bind our server information to our socket and check if there is any errors in binding to that port.

if(bind(sServer, (LPSOCKADDR)&sinServer, sizeof(sinServer)) == SOCKET_ERROR)

{

/* failed at starting server */

printf("Could not bind the server!\n");

WSACleanup();

return 0;

}

 

//We now listen for connections at our socket.

//This allows us to accept "20" max clients to connect at the same time

while(listen(sServer, 20) == SOCKET_ERROR)\

{

Sleep(1000);

}

 

printf("Waiting for a Client!\n");

 

//Now let's establish a Client socket so that we can pick and choose WHICH clients to talk to

SOCKET sClient;

int szlength;

 

szlength = sizeof(sinServer);

sClient = accept(sServer, (LPSOCKADDR)&sinServer, &szlength);//We also accept a client as sClient on the sServer socket.

//So now we can use sClient to talk to that specific client.

if (sClient == INVALID_SOCKET)

{

//check for errors

printf("Could not accept this client!\n");

closesocket(sServer);

WSACleanup();

return 0;

}

else

{

printf("Accepted a Client!\n");

}

 

// Now we can send/recv data!

int iRet;

char buffer[50];

 

printf("Sending data to client ");

 

char * message = "Welcome to our Server";

 

//this massage we send to client

strcpy(buffer, message);

 

iRet = send(sClient, buffer, 49, 0);//sending message to client

 

//check for errors

if(iRet == SOCKET_ERROR)

{

printf("Could not send data!\n");

closesocket(sClient);

closesocket(sServer);

WSACleanup();

return 0;

}

 

printf("\n Server is ready for recieving messages \n");

char *cClientMessage;

cClientMessage = new char [50];

//cClientMessage[49] = 0;

 

do {

iRet = recv(sClient, cClientMessage, strlen(cClientMessage), 0);

if (iRet > 0)

printf("Client Response:%s \n",cClientMessage);

else if (iRet == 0)

printf("Connection closed\n");

else

printf("recv failed: %d\n", WSAGetLastError());

 

} while(iRet > 0);

 

delete [] cClientMessage;

// Cleanup

closesocket(sClient);

closesocket(sServer);

// Shutdown Winsock

WSACleanup();

return 0;

}

 

 

-----------------------------------------------Клієнт-----------------------------------------------------

#include <winsock2.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

#using <mscorlib.dll>

using namespace System;

 

int main()

{

WSADATA t_wsa; // WSADATA structure

int iError; // error number

 

iError = WSAStartup(MAKEWORD(2,2), &t_wsa); // Start the WSADATA

 

if(iError!= NO_ERROR)

{

printf("Error at WSAStartup()\n");

WSACleanup();

return 0;

}

 

SOCKET sClient;

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sClient == INVALID_SOCKET || iError == 1)

{

printf("Invalid Socket!\n");

WSACleanup();

return 0;

}

 

SOCKADDR_IN sinClient;

memset(&sinClient, 0, sizeof(sinClient));

 

char cIP[50];

strcpy(cIP, "127.0.0.1");

sinClient.sin_family = AF_INET;

sinClient.sin_addr.s_addr = inet_addr(cIP);

sinClient.sin_port = htons(7);

 

if(connect(sClient, (LPSOCKADDR)&sinClient, sizeof(sinClient)) == SOCKET_ERROR)

{

/* failed at starting server */

printf("Could not connect to the server!\n");

WSACleanup();

return 0;

}

// Now we can send/recv data!

int iRet;

char buffer[50];

 

strcpy(buffer, "Hey server, I just connected!");

iRet = send(sClient, buffer, 49, 0);

if(iRet == SOCKET_ERROR)

{

printf("Could not send data!\n");

WSACleanup();

return 0;

}

 

char *cServerMessage;

cServerMessage = new char [50];

 

printf("\n Receiving data from server \n");

 

do {

DateTime t1 = DateTime::Now;

 

iRet = recv(sClient, cServerMessage, strlen(cServerMessage), 0);

 

DateTime t2 = DateTime::Now;

 

if(iRet == SOCKET_ERROR)

{

char cError[100];

sprintf(cError, "Connection failed, WINSOCK error code: %d",

WSAGetLastError());

closesocket(sClient);

WSACleanup();

return 0;

}

 

if (iRet > 0)

{

DateTime total = DateTime(t2.Subtract(t1).Ticks);

printf("\n Server Response: %s",cServerMessage);

Console::WriteLine("\n Time for receiving: " + total.ToString("HH")

+" h" + total.ToString(" mm") + " min" + total.ToString(" ss") + "

sec" + total.ToString(" ffffff") + " microsec");

}

else if (iRet == 0) printf("Connection closed\n");

else printf("recv failed: %d\n", WSAGetLastError());

 

} while(iRet > 0);

 

delete [] cServerMessage;

// Cleanup

closesocket(sClient);

// Shutdown Winsock

WSACleanup();

return 0;

}

 


Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.02 сек.)