Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кулаков В.Г. Методические указания к лабораторн...doc
Скачиваний:
5
Добавлен:
04.05.2019
Размер:
286.72 Кб
Скачать

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;

}