Пример реализации TCP-клиента
// Пример простого 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 Тема: Организация работ при создании программных продуктов. Сетевое планирование. Иерархическая организация управления разработкой. Специализация групп программистов. Методы бригадной организации. Сетевое планирование
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (242)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |