Mickey_from_nsk
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору zam Вообще то я привык общаться на ты. Если немного подождешь (день - два) - немного найду времени и напишу такую штуку. Сейчас времени маловато. Мдааа. Провокационные ты задачи ставишь. Все отложил и написал. Лови, незабудь при сборке подключить библиотеку ws2_32.lib (Для visual studio). ---------------------------------------------------------- #include <stdio.h> #include <string.h> #include <WinSock2.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"); 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(); } ------------------------------------------------- |