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