Задание 1 Задание 2 Задание 3 Задание 4 Задание 8 1. Расчет характеристик сети 1.1 Исходные данные для расчета 1.2 Расчет PDV 1.3 Расчет PW 1.4 Построение схемы сети 2. Теоретические вопросы Список использованных источников
Задание 1 Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу символьную строку, содержащую пробелы и получает назад ту же строку, но в ней между словами должен находиться только один пробел.
#include <winsock2.h> // Wincosk2.h должен быть подключен раньше windows.h! #include <windows.h>
#include <stdio.h> #define MY_PORT 666 // Порт, который слушает сервер
// Эта функция создается в отдельном потоке и // обсуживает очередного подключившегося клиента // независимо от остальных DWORD WINAPI ServClient(LPVOID client_socket) { SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0]; char buff[1024]; #define sHELLO "Hello from server\r\n"
// цикл эхо-сервера: прием строки от клиента и // возврат результатов обработки клиенту int bytes_recv; while( (bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && bytes_recv !=SOCKET_ERROR) { char newbuff[1024]; int len=0; for(int i=0,j=0;i<strlen(buff);i++) if(buff[i]==' ' && buff[i-1]==' ' && i>0) continue; else { newbuff[j]=buff[i]; j++; } newbuff[j]='\0'; send(my_sock,newbuff,sizeof(char)*strlen(newbuff),0); } // если мы здесь, то произошел выход из цикла по // причине возращения функцией recv ошибки – // соединение клиентом разорвано printf("-disconnect\n");
// Шаг 1 - Инициализация сокетов // Т.к. возвращенная функцией информация // не используется ей передается указатель на // рабочий буфер, преобразуемый // к указателю на структуру WSADATA. // Такой прием позволяет сэкономить одну // переменную, однако, буфер должен быть не менее // полкилобайта размером (структура WSADATA // занимает 400 байт) if (WSAStartup(0x0202,(WSADATA *) &buff[0])) { // Ошибка! printf("Error WSAStartup %d\n", WSAGetLastError()); return -1; }
// Шаг 2 - создание сокета SOCKET mysocket; // AF_INET - сокет Интернета // SOCK_STREAM - потоковый сокет (с // установкой соединения) // 0 - по умолчанию выбирается TCP протокол if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0) { // Ошибка! printf("Error socket %d\n",WSAGetLastError()); WSACleanup(); // Деиницилизация библиотеки Winsock return -1; }
// Шаг 3 связывание сокета с локальным адресом sockaddr_in local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=htons(MY_PORT); // не забываем о сетевом порядке!!! local_addr.sin_addr.s_addr=0; // сервер принимает подключения // на все IP-адреса
// Шаг 1 - инициализация библиотеки Winsock if (WSAStartup(0x202,(WSADATA *)&buff[0])) { printf("WSAStart error %d\n",WSAGetLastError()); return -1; }
// Шаг 2 - создание сокета SOCKET my_sock; my_sock=socket(AF_INET,SOCK_STREAM,0); if (my_sock < 0) { printf("Socket() error %d\n",WSAGetLastError()); return -1; }
// Шаг 3 - установка соединения // заполнение структуры sockaddr_in // указание адреса и порта сервера sockaddr_in dest_addr; dest_addr.sin_family=AF_INET; dest_addr.sin_port=htons(PORT); HOSTENT *hst;
// преобразование IP адреса из символьного в // сетевой формат if (inet_addr(argv[1])!=INADDR_NONE) dest_addr.sin_addr.s_addr=inet_addr(argv[1]); else // попытка получить IP адрес по доменному // имени сервера if (hst=gethostbyname(argv[1])) // hst->h_addr_list содержит не массив адресов, // а массив указателей на адреса ((unsigned long *)&dest_addr.sin_addr)[0]= ((unsigned long **)hst->h_addr_list)[0][0]; else { printf("Invalid address %s\n",argv[1]); closesocket(my_sock); WSACleanup(); return -1; }
// адрес сервера получен – пытаемся установить // соединение if (connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) { printf("Connect error %d\n",WSAGetLastError()); return -1; }
printf("Connection with %s succesfully established\n\ Type 'quit' for quit\n\n",argv[1]);
// Шаг 4 - чтение и передача сообщений int nsize; while((nsize=recv(my_sock,&buff[0],sizeof(buff)-1,0))!=SOCKET_ERROR) { // ставим завершающий ноль в конце строки buff[nsize]=0;
// выводим на экран printf("\nS=>C:%s\n",buff);
// читаем пользовательский ввод с клавиатуры printf("S<=C:"); fgets(buff,sizeof(buff)-1,stdin);
// проверка на "quit" if (!strcmp(buff,"quit\n")) { // Корректный выход printf("Exit..."); closesocket(my_sock); WSACleanup(); return 0; }