- •Лабораторная работа №1
- •1.1. Цель и содержание работы
- •1.2. Основные конструкции языка c
- •Int X; // Переменная типа int
- •Int list[20]; // Массив целых величин
- •If (условие) оператор1 else оператор2
- •1.3. Функции ввода-вывода языка с
- •1.4. Создание консольного приложения
- •1.5. Меню интегрированной среды
- •1.6. Компиляция, отладка и запуск программы
- •1.7. Упражнения
- •Лабораторная работа №2
- •2.1. Цель и содержание работы
- •2.2. Использование функций библиотеки ipHlpApi
- •2.3. Упражнения
- •Int iErr; // Код ошибки
- •Лабораторная работа №3
- •3.1. Цель и содержание работы
- •3.2. Библиотека функций Winsock2
- •3.3. Структуры данных для работы с сокетами
- •3.4. Приложение-сервер
- •3.5. Приложение-клиент
- •3.6. Упражнения
- •Лабораторная работа №4
- •4.1. Цель и содержание работы
- •4.2. Функции для работы по протоколу udp
- •4.3. Приложение-сервер
- •4.4. Приложение-клиент
- •4.5. Упражнения
- •Лабораторная работа №5
- •5.1. Цель и содержание работы
- •5.2. Сканирование портов
- •5.3. Функции для определения состояния портов
- •5.4. Упражнения
- •Лабораторная работа №6
- •6.1. Цель и содержание работы
- •6.2. Сниффер
- •6.3. Упражнения
- •Библиографический список
3.5. Приложение-клиент
Рассмотрим порядок действий, которые должно выполнять приложение-клиент.
Первый шаг – инициализировать библиотеку Winsock.
Второй шаг – создать сокет с помощью функции socket.
Третий шаг – для установки соединения с удаленным узлом вызвать функцию int connect(SOCKET s, const struct sockaddr FAR* name, int namelen). Первый аргумент функции – дескриптор сокета, второй – указатель на структуру sockaddr, а третий – размер структуры. После вызова connect система предпринимает попытку установить соединение с указанным узлом. Если по каким-то причинам это сделать не удастся, функция возвратит ненулевое значение.
Функция connect связывает сокет клиента с произвольно выбранным портом (номер порта 1024).
Четвертый шаг – прием и передача сообщений с помощью функций recv и send.
Текст программы-клиента приведен в листинге 3.2. Программа продолжает работу, пока с клавиатуры не введено слово «quit».
Листинг 3.2. TCP-клиент
#include "stdafx.h"
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#define PORT 650
#define SERVERADDR "127.0.0.1"
int main(int argc, char* argv[])
{
char buff[1024];
printf("TCP CLIENT\n");
// Шаг 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 -2;
}
// Шаг 3 - установка соединения
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
HOSTENT *hst;
// Преобразование IP адреса в сетевой формат
if(inet_addr(SERVERADDR) != INADDR_NONE)
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
// Попытка получить IP адрес по доменному имени сервера
else if(hst=gethostbyname(SERVERADDR))
((unsigned long *)&dest_addr.sin_addr)[0]=
((unsigned long **)hst->h_addr_list)[0][0];
else
{
printf("Invalid address %s\n",SERVERADDR);
closesocket(my_sock); WSACleanup(); return -3;
}
// Адрес сервера получен – пытаемся установить соединение
if(connect(my_sock,(sockaddr *)&dest_addr,
sizeof(dest_addr)))
{
printf("Connect error %d\n",WSAGetLastError());
return -4;
}
printf("Connected to server %s\n", SERVERADDR);
printf("Type quit for quit\n\n");
// Шаг 4 - чтение и передача сообщений
while(int nsize=recv(my_sock,buff,sizeof(buff),0)>0)
{
printf("S=>C:%s\n",buff); // Выводим строку на экран
printf("S<=C:");
gets(buff); // Вводим строку с клавиатуры
// Выход, если введено слово quit
if (!strcmp(buff,"quit"))
{
printf("Exit...");
closesocket(my_sock);
WSACleanup();
return 0;
}
// Передаем строку клиента серверу
send(my_sock,buff,strlen(buff)+1,0);
}
printf("Recv error %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -5;
}