bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [197]
Бухучет [16]
ВМиМОвЭ [4]
ОДМиТА [13]
ОЛОБД [17]
ООПиП [67]
ОС [19]
ПСОД [47]
Форма входа
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Файловый архив
Файлы » ИСиТвЭ » Другое

КС вариант 51
Подробности о скачивании 04.05.2012, 17:52
Содержание

Задание 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);

// Эта функция создается в отдельном потоке и
// обсуживает очередного подключившегося клиента
// независимо от остальных
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"

// отправляем клиенту приветствие
send(my_sock,sHELLO,sizeof(sHELLO),0);

// цикл эхо-сервера: прием строки от клиента и
// возврат результатов обработки клиенту
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");

// закрываем сокет
closesocket(my_sock);
return 0;
}

int main(void)
{

char buff[1024]; // Буфер для различных нужд

printf("TCP SERVER\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-адреса

// вызываем bind для связывания
if (bind(mysocket,(sockaddr *) &local_addr,sizeof(local_addr)))
{
// Ошибка
printf("Error bind %d\n",WSAGetLastError());
closesocket(mysocket); // закрываем сокет!
WSACleanup();
return -1;
}

// Шаг 4 ожидание подключений
// размер очереди – 0x100
if (listen(mysocket, 0x100))
{
// Ошибка
printf("Error listen %d\n",WSAGetLastError());
closesocket(mysocket);
WSACleanup();
return -1;
}

printf("Waiting for connections\n");

// Шаг 5 извлекаем сообщение из очереди
SOCKET client_socket; // сокет для клиента
sockaddr_in client_addr; // адрес клиента
// (заполняется системой)

// функции accept необходимо передать размер
// структуры
int client_addr_size=sizeof(client_addr);

// цикл извлечения запросов на подключение из
// очереди
while((client_socket=accept(mysocket, (sockaddr *)&client_addr, &client_addr_size)))
{

// пытаемся получить имя хоста
HOSTENT *hst;
hst=gethostbyaddr((char *)&client_addr.sin_addr.s_addr,4, AF_INET);

// вывод сведений о клиенте
printf("+%s [%s] new connect!\n",(hst)?hst->h_name:"",inet_ntoa(client_addr.sin_addr));

ServClient(&client_socket);
}

return 0;
}

//TCP клиент
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

#define PORT 666

int main(int argc, char* argv[])
{
char buff[1024];
printf("TCP CLIENT\n");

if(argc<2)
{
printf("Usage: client.exe server_ip");
return -1;
}

// Шаг 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;
}

int t=strlen(buff);
if(strlen(buff)<=1) strcpy(buff,"empty");
// передаем строку клиента серверу
buff[strlen(buff)-1]='\0';
send(my_sock,buff,strlen(buff)+1,0);
}

printf("Recv error %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
Категория: Другое | Добавил: galkinss
Просмотров: 2222 | Загрузок: 92
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]