Мегаобучалка Главная | О нас | Обратная связь


Пример реализации TCP-клиента



2019-07-03 212 Обсуждений (0)
Пример реализации TCP-клиента 0.00 из 5.00 0 оценок




// Пример простого TCP клиента

#include <stdio.h>

#include <string.h>

#include <winsock2.h>

#include <windows.h>

 

 

#define PORT 666

#define SERVERADDR "127.0.0.1"

 

int main(int argc, char* argv[])

{

char buff[1024];

printf("TCP DEMO 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 -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(SERVERADDR)!=INADDR_NONE)

dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);

else

// попытка получить IP адрес по доменному

// имени сервера

if (hst=gethostbyname(SERVERADDR))

// 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",SERVERADDR);

   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("Соединение с %s успешно установлено\n\

Type quit for quit\n\n",SERVERADDR);

 

// Шаг 4 - чтение и передача сообщений

int nsize;

while((nsize=recv(my_sock,&buff[0],

                 sizeof(buff)-1,0))

             !=SOCKET_ERROR)

{

// ставим завершающий ноль в конце строки

buff[nsize]=0;

 

// выводим на экран

printf("S=>C:%s",buff);

 

// читаем пользовательский ввод с клавиатуры

printf("S<=C:"); fgets(&buff[0],sizeof(buff)-1,

        stdin);

 

// проверка на "quit"

if (!strcmp(&buff[0],"quit\n"))

{

   // Корректный выход

   printf("Exit...");

   closesocket(my_sock);

   WSACleanup();

   return 0;

}

 

// передаем строку клиента серверу

send(my_sock,&buff[0],nsize,0);

}

 

printf("Recv error %d\n",WSAGetLastError());

closesocket(my_sock);

 WSACleanup();

return -1;

}

Пример реализации обмена в оболочке Windows (в среде C++ Builder)

/---------------------------------------------------------------------------

 

#pragma hdrstop

 

#include <stdio.h>

#include <string.h>

#include <WinSock2.h>

#include <conio.h>

 

#define CHECK_URL(x,y) if (x)

 {fprintf(stderr, ToConsole(y)); return NULL;}

 

struct sockaddr_in sa;

char buf[1024];

// Для простоты - фиксируем размер буфера для адреса

 

 

char conBuf[1024];// Буфер для конвертации консольных сообщений

char* ToConsole(char* str)

{

CharToOem(str, conBuf);

return conBuf;

}

 

char* parseURL(char* _url)

{

// Проверяем входной протокол

char *ptr = strchr(_url, ':');

CHECK_URL(ptr == NULL, "Имя протокола отсутствует.\n");

 

*ptr = '\0';

CHECK_URL(stricmp(_url, "http") != 0,

 "Недопустимое имя протокола.\n");

CHECK_URL(strncmp(++ptr, "//", 2) != 0,

 "Неправильный формат URL.\n");

 

ptr+=2;

char* eptr = strchr(ptr, '/');

CHECK_URL(eptr == NULL, "Нет имени страницы");

strcat(buf, eptr+1);

 

*eptr = '\0';

eptr = strchr(ptr, ':');

if (eptr != NULL) 

{

char* leptr;

short port = (short)strtol(eptr+1,&leptr, 10);

if (eptr == leptr) port = 80;

//Тут можно выдать ошибку насчет неверного порта

*eptr = '\0';

sa.sin_port = htons(port);

}

else

sa.sin_port = htons(80);

 

struct hostent *he = gethostbyname(ptr);

if (he == NULL)

{

he = gethostbyaddr(ptr, strlen(ptr), AF_INET);

CHECK_URL(he == NULL, "Недопустимое имя сервера");

}

memcpy(&sa.sin_addr.S_un.S_addr, he->h_addr, sizeof(sa.sin_addr.S_un.S_addr));

return buf;

}

 

void main(int argc, char**argv)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

 

wVersionRequested = MAKEWORD( 1, 1 );

 

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) 

{

fprintf(stderr, ToConsole(

"Невозможно инициализировать Windows Sockets.\n"));

return;

}

 

// Проверяем запрошенную версию Windows sockets

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 

{

fprintf(stderr, ToConsole(

"Максимально доступная версия Windows Sockets : %d.%d - \ недопустима."), 

(int)(LOBYTE( wsaData.wVersion )),

(int)(HIBYTE( wsaData.wVersion )));

WSACleanup( );

return; 

}

 

// Windows Sockets инициализирована

struct protoent *pe = getprotobyname("tcp");

// Запрашиваем идентификатор протокола

SOCKET sock = socket(AF_INET, SOCK_STREAM, pe->p_proto);

// Создаем сокет

 

strcpy(buf, "GET /");

// Обрабатываем адрес. Допустимые форматы:

// http://hostname:port/URL

// http://hostname/URL - по умолчанию - 80 порт

if (argc >= 2)// Есть входной параметр

{

if (parseURL(argv[1]) == NULL) 

{ closesocket(sock); WSACleanup(); return; }

}

else

//parseURL("http://localhost:80/index.html");

parseURL("http://localhost:80/C:\\Program Files\\Calibre2\\Lib\\site-packages\\win32com\\HTML\\index.html");

strcat(buf, " HTTP/1.0\n\n");

 

sa.sin_family = AF_INET;

memset(&sa.sin_zero, 0, sizeof(sa.sin_zero));

if (connect( sock, (struct sockaddr*)(&sa), sizeof(sa)) != 0)

{

fprintf(stderr, ToConsole("Ошибка при подключении №%d\n"), WSAGetLastError());

closesocket(sock); WSACleanup(); return;

}

 

//Посылаем запрос на извлечение страницы

send(sock, buf, strlen(buf), 0);

char recvbuf[1024];

int received = 0;

while((received = recv(sock,recvbuf, sizeof(recvbuf)-1,0)) > 0)

{

recvbuf[received] = '\0';

fprintf(stdout, recvbuf);

}

closesocket(sock);

WSACleanup();

getch();

}

Лекция 8

Тема: Организация работ при создании программных продуктов. Сетевое планирование. Иерархическая организация управления разработкой. Специализация групп программистов. Методы бригадной организации.

Сетевое планирование

 



2019-07-03 212 Обсуждений (0)
Пример реализации TCP-клиента 0.00 из 5.00 0 оценок









Обсуждение в статье: Пример реализации TCP-клиента

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (212)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)