Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает простой прокси-сервер, Не получается открыть www.ya.ru 
:(
    Опции темы
Gwynbleiddd
Дата 5.3.2012, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Добрый вечер

Написал простой прокси.
Идея такова:
0. Запускаем Оперу и в настройках указываем наш прокси-сервер
1. Получаем запрос от клиента
2. Разбираем его по строчкам
3. "Склеиваем" новый запрос 
2. Передаём этот запрос хосту
3. Принимаем ответ хоста
4. Передаём ответ клиенту

Когда пробовал на Денвере - то всё прекрасно работает.
Но вот когда пытаешься открыть www.ya.ru или www.rambler.ru, например, то ничего не выходит, браузер показывает просто белую страницу :(
И вторая проблема: если после того, как отработает функция ParserRequest, вывести на экран массив totalbuf, то в нём содержится только первая строка запроса + User-Agent. Всё остальное как будто затирается. В чём может быть причина?

Пример запроса от браузера:
Код

GET http://www.ya.ru/ HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60
Host: www.ya.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Cookie: yandexuid=5594903511330216492
Pragma: no-cache
Cache-Control: no-cache
Connection: Keep-Alive


Вот ответ www.ya.ru на этот запрос:
Код

HTTP/1.1 200 Ok
Server: nginx
Date: Mon, 05 Mar 2012 18:20:46 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Mon, 05 Mar 2012 18:20:46 GMT
Last-Modified: Mon, 05 Mar 2012 18:20:46 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
X-XRDS-Location: http://openid.yandex.ru/server_xrds/
Content-Encoding: gzip


Далее идёт следующий запрос от браузера:
Код

GET http://www.ya.ru/favicon.ico HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60
Host: www.ya.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Pragma: no-cache
Cache-Control: no-cache
Connection: Keep-Alive


И соответственно ответ на него:
Код

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 05 Mar 2012 18:20:46 GMT
Content-Type: image/x-icon
Content-Length: 1150
Last-Modified: Fri, 02 Mar 2012 18:45:48 GMT
Connection: close
Accept-Ranges: bytes


Вот код прокси:
Код

// Подключаем необходимые библиотеки
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")

// Определяем параметры прокси: порт и ip-адрес
#define PROXY_PORT 7777 // порт прокси
#define PROXY_IP "192.168.126.10" // ip-адрес прокси-сервера

// Определяем ключевые слова для разбора запроса клиента
#define HTTP  "http://"
#define USER_AGENT "User-Agent:"
#define HOST "Host:"
#define ACCEPT "Accept:"
#define ACCEPT_LANGUAGE "Accept-Language:"
#define ACCEPT_ENCODING "Accept-Encoding:"
#define PRAGMA "Pragma:"
#define CACHE_CONTROL "Cache-Control:"
#define CONNECTION "Connection:"
#define COOKIE "Cookie:"
#define REFERER "Referer:"
#define ACCEPT_CHARSET "Accept-Charset:"
#define EMPTY_STRING "\r\n"

// Структура с параметрами прокси, когда он будет подключаться к хосту
struct ProxyParam
{ 
    char HostAddress[128]; // IP-Адрес хоста
    char HostName[256];// Имя хоста
    int  HostPort;         // ПОрт, по которому будет соединение с хостом
}; 

// Структура для разбора запроса клиента
struct ProxyRequest
{
    char Command [10]; 
    char URL [512]; 
    char Protocol [10]; 
    char User_Agent[1024]; 
    char Host[256]; 
    char Accept[1024];
    char Referer [256]; 
    char Accept_Language[50]; 
    char Accept_Encoding[50]; 
    char Accept_Charset [50]; 
    char Cookie [2048];
    char Pragma[10];
    char Cache_Control[15];
    char Сonnection[15];   
};

// Вспомогательная функция для разбора запроса клинта. 
void func ( char *a, char *b, char *c)//char *buf)
{
    if(a) // если в p не ноль, т.е. в нашем массиве buf всё таки было вхождение 'User-Agent:'
    {    
        int i;
        a+=strlen(b); //прибавляем к указателю р длину 'User-Agent:'
        for(i=0;i<strlen(a);i++) //
            if( *(a+i)=='\r') break; //получаем значение, которое следует за 'User-Agent:'
            *(a+i)=0;
        strcpy(c,a);
    }
}

// Функция разбора запроса клиента
int ParserRequest (char *str, struct ProxyRequest *pRequest) 
{
    char *url, *u, *h, *a, *r, *al, *ae, *ac, *pr, *cc, *con, *cok; // Указатели для поиска в запросе ключевых слов
    
    sscanf(str,"%s%s%s",pRequest->Command, pRequest->URL, pRequest->Protocol); 
    
    u = strstr(str, USER_AGENT); //
    h = strstr(str, HOST);
    a = strstr(str, ACCEPT);
    r = strstr (str, REFERER);
    al = strstr(str, ACCEPT_LANGUAGE);
    ae = strstr(str, ACCEPT_ENCODING);
    ac = strstr (str, ACCEPT_CHARSET);
    cok = strstr(str, COOKIE);
    pr = strstr(str, PRAGMA);    
    cc = strstr(str, CACHE_CONTROL);
    con = strstr(str, CONNECTION);
                
    func (u, USER_AGENT, pRequest->User_Agent);    
    func (h, HOST, pRequest->Host);
    func (a, ACCEPT, pRequest->Accept);
    func (r, REFERER, pRequest->Referer);
    func (al, ACCEPT_LANGUAGE, pRequest->Accept_Language);
    func (ae, ACCEPT_ENCODING, pRequest->Accept_Encoding);
    func (ac, ACCEPT_CHARSET, pRequest->Accept_Charset);
    func (cok, COOKIE, pRequest->Cookie);
    func (pr, PRAGMA, pRequest->Pragma);
    func (cc, CACHE_CONTROL, pRequest->Cache_Control);
    func (con, CONNECTION, pRequest->Сonnection);
    
    return 1;
}

int GetAddressAndPort (char *str, char *address, int *port) 
{
    
    char buf[256], command[5], proto[10], *p;
    int i, j;
    sscanf (str, "%s%s%s", command, buf, proto);
    p=strstr(buf,HTTP); //ищем вхождение http:// в нашем массиве buf. если вхождение нашлось, то в p будет указатель на это вхождение.
    //HTTP
    if(p) // если в p не ноль, т.е. в нашем массиве buf всё таки было вхождение http://
    {
        p+=strlen(HTTP); //прибавляем к указателю р длину 'http://'
        for(i=0;i<strlen(p);i++) //
            if( *(p+i)=='/') break; //получаем адрес хоста, к которому обращается клиент
        *(p+i)=0;
        strcpy(address,p); //копируем в переменную address наш указатель p, т.е. как раз адрес сервера
        *port=80;      //default http port 
    } 
        
    return 1;
}

// Функция для сцепления строк изменённого запроса
char *UnionModifiedRequest(char *s1, ...)
{ char **cp = &s1;            //--адрес первого указателя
   int len = 0;        
   // цикл для определения общей длины сцепляемых строк
   while (*cp) { len += strlen(*cp); cp++; }                          
  char *s = new char[len+1];       //--память для строки
  s[0]=0;                       //-- "очищаем" строку
// цикл для сцепления строк
  cp=&s1;                       //-- опять установка на 1-й параметр
  while (*cp) 
  {  strcat(s, *cp);             //-- прицепляем первую (и следующие)
     cp++;                       //-- перемещаемся на следующую
  }         
  return s;
}

int Proxy (LPVOID clientsocket) // Основная функция
{
    char totalbuf[10240];
    struct in_addr host2_addr; //
    int retval, len;
    SOCKET hostsocket;
    struct hostent *ht;
    char *host_name;
    int i;
    ProxyParam  pProxy; // Структура с параметрами прокси - Имя и Адрес хоста, а так же номер порта куда подключаться после запроса клиента
    struct ProxyRequest proxyRequest; // Структура с разобранным запросом клиента
    struct ProxyRequest modifiedRequest; // Структура с изменённым запросом клиента
    struct sockaddr_in host_addr;
            
    hostsocket = socket(AF_INET, SOCK_STREAM, 0); // Определяем сокет хоста, по которому будет происходить подключение от прокси к хосту

    ZeroMemory(totalbuf, sizeof(totalbuf)); // Обнуляем массив для приёма запроса  от клиента
        
    retval = recv((SOCKET)clientsocket, totalbuf, sizeof(totalbuf), 0); // Приняли запрос от клиента 
        
    printf("\n Received %d bytes,data\n[%s]\nfrom client\n",retval,totalbuf);

    len = retval; // Размер принятых данных, т.е. размер запроса

    ZeroMemory (pProxy.HostName, sizeof(pProxy.HostName));
    GetAddressAndPort (totalbuf, pProxy.HostName, &pProxy.HostPort); // Получаем из массива Имя хоста
          
    host_name = pProxy.HostName;
    ht = gethostbyname (host_name); // Получаем IP-адрес хоста, к которому хочет подключиться клиент

    i=0;

    while (ht->h_addr_list[i] != 0)
        {
            host2_addr.s_addr = *(u_long *)ht->h_addr_list[i++]; 
        }
        
    ZeroMemory(&host_addr, sizeof(host_addr));

    // Заполняем адресную информацию для подключения к хосту
    host_addr.sin_family = AF_INET; 
    host_addr.sin_addr.s_addr = host2_addr.s_addr; 
    host_addr.sin_port = htons(pProxy.HostPort); // Номер порта получили в функции GetAddressAndPort

    if (connect(hostsocket, (struct sockaddr *)&host_addr, sizeof(host_addr)) == SOCKET_ERROR) // Устанавливаем соединение с хостом
    {
        printf ("Connect () Error: %d\n", WSAGetLastError());
        return -1;
    }
    
    ZeroMemory (&proxyRequest, sizeof(proxyRequest));    
    ParserRequest (totalbuf, &proxyRequest); // Разбираем запрос клиента и сохраняем результаты в структуру pRequest. 
                
    char *ss = UnionModifiedRequest(proxyRequest.Command, " ", proxyRequest.URL, " ",  proxyRequest.Protocol, EMPTY_STRING, 
                                    USER_AGENT, proxyRequest.User_Agent, EMPTY_STRING,
                                    HOST, proxyRequest.Host, EMPTY_STRING,
                                    ACCEPT, proxyRequest.Accept, EMPTY_STRING,
                                    ACCEPT_LANGUAGE, proxyRequest.Accept_Language, EMPTY_STRING,
                                    ACCEPT_ENCODING, proxyRequest.Accept_Encoding, EMPTY_STRING,
                                    COOKIE, proxyRequest.Cookie, EMPTY_STRING,
                                    PRAGMA, " no-cache", EMPTY_STRING,
                                    CACHE_CONTROL, proxyRequest.Cache_Control, EMPTY_STRING,
                                    CONNECTION, proxyRequest.Сonnection, EMPTY_STRING, EMPTY_STRING, 0);

    retval = send(hostsocket, ss, strlen(ss), 0); // Посылаем принятые данные от клиента хосту
    if(retval == SOCKET_ERROR)
    {
        printf ("send () Error: %d\n", WSAGetLastError());
        closesocket (hostsocket);
    }
    
    ZeroMemory(totalbuf, sizeof(totalbuf));
    len = 0;
           
    retval = recv((SOCKET)hostsocket, totalbuf, sizeof(totalbuf), 0); // Принимаем ответ хоста на посланный запрос
    if (retval == INVALID_SOCKET)
    {
        printf ("\nError Recv.");
        closesocket ((SOCKET)hostsocket);
    }
    
    printf("\n Received %d bytes,data\n[%s]\nfrom server\n",len,totalbuf);

    len = retval;

    closesocket (hostsocket); // Закрыли соединение с хостом
    
    retval = send ((SOCKET)clientsocket, totalbuf, len, 0); // Пересылаем ответ хоста клиенту
    if (retval == SOCKET_ERROR)
    {
        printf ("send () Error: %d\n", WSAGetLastError());
        closesocket ((SOCKET)clientsocket);
    }
    
    closesocket((SOCKET)clientsocket); // Закрыли соединение с клиентом
    return 0;
}

int main(void)
{
    setlocale(LC_ALL, "Russian"); // Для отображения кириллицы в консоли

    WSADATA wsd; // Для инициализации библиотеки сокетов
    SOCKET listensocket, clientsocket; // дескрипторы сокетов
    struct sockaddr_in server_addr, client_addr; // Адресная информация самого прокси и клиента
    struct hostent *client; //

    if(WSAStartup (0x201, &wsd) != 0) //Инициализируем библиотеку сокетов
    {
        printf ("\n Error in Startup session.\n");
        WSACleanup();
        return -1;
    } 

    // Заполняем адресную информацию для соединения с клиентом
    server_addr.sin_family = AF_INET; // Адресное семество
    server_addr.sin_addr.s_addr = INADDR_ANY; // 
    server_addr.sin_port = htons(PROXY_PORT); // Порт, на котором "висит" прокси (7777)

    listensocket = socket(AF_INET, SOCK_STREAM, 0); // Определяем сокет прокси, на котором будет происходить прослушивание сети
    if (listensocket == INVALID_SOCKET)
    {
        printf ("\n Error in New a Socket.");
        WSACleanup();
        return -2;
    }
    
    if (bind(listensocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) 
    {
        printf ("\n Error in Binding socket.");
        WSACleanup();
        return -3;
    }
    
    if (listen (listensocket, 5) != 0) // Создаём очередь на прослушивание сети, максимум 5 подключений
    {
        printf ("\n Error in Listen.");
        WSACleanup ();
        return -4;
    }
    
    int size_of_cli = sizeof(client_addr); // Размер структуры sockaddr_in client_addr с адресной информацией клиента

    while (1)
    {
    // Принимаем соединение от клиента к прокси на сокет клиента
        clientsocket = accept(listensocket, (struct sockaddr *)&client_addr, &size_of_cli);

        if (clientsocket == INVALID_SOCKET)
            {
                printf ("\n Error in Accept.");
                WSACleanup();
                return -5;
            } 
        else
        {
            client = gethostbyaddr ((char *)&client_addr.sin_addr.s_addr, 4, AF_INET); // Получаем информацию о клиенте, который к нам подключается
            Proxy ((LPVOID) clientsocket);
        }
        }

        return 1;
}


Сразу пояснения:
1. Необходимо разбирать запрос
2. Если отсылать оригинальный запрос, то www.ya.ru отвечает "Bad Request, видимо - на отсутствие параметра Pragma. Поэтому когда "склеиваем" новый запрос, вставляем этот параметр вручную

Буду признателен за помощь smile
Спасибо.

Это сообщение отредактировал(а) Gwynbleiddd - 5.3.2012, 22:12
PM MAIL   Вверх
boostcoder
Дата 5.3.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



для начала, отформатируй код так, чтоб строки вмещались в ширину страницы.
PM WWW   Вверх
Gwynbleiddd
Дата 5.3.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Поправил smile
В будущем учту, спасибо
PM MAIL   Вверх
boostcoder
Дата 5.3.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



если отключить все, оставив только перегонку трафа - браузер с проксей работает как надо?
PM WWW   Вверх
Gwynbleiddd
Дата 5.3.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Сейчас отключил функцию ParserRequest и UnionModifiedRequest
Запрос от браузера:

Код

GET http://www.ya.ru/ HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60
Host: www.ya.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, imag
e/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Cookie: yandexuid=5594903511330216492
Cache-Control: no-cache
Connection: Keep-Alive



Ответ сервера:

Код

HTTP/1.1 200 Ok
Server: nginx
Date: Mon, 05 Mar 2012 20:04:11 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Mon, 05 Mar 2012 20:04:12 GMT
Last-Modified: Mon, 05 Mar 2012 20:04:12 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE
NAV UNI"
X-XRDS-Location: http://openid.yandex.ru/server_xrds/
Content-Encoding: gzip



И следом идёт второй запрос от браузера:
Код

GET http://www.ya.ru/favicon.ico HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60
Host: www.ya.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, imag
e/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://www.ya.ru/
Connection: Keep-Alive



И ответ на него:
Код

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 05 Mar 2012 20:04:12 GMT
Content-Type: image/x-icon
Content-Length: 1150
Last-Modified: Mon, 05 Mar 2012 17:44:28 GMT
Connection: close
Accept-Ranges: bytes

PM MAIL   Вверх
boostcoder
Дата 5.3.2012, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



лень вникать. скажи просто: да/нет?
PM WWW   Вверх
Gwynbleiddd
Дата 6.3.2012, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Нет, когда убираешь всё лишнее, то всё равно просто белая страница
PM MAIL   Вверх
boostcoder
Дата 6.3.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



вот и славно. с этого и начнем.
PM WWW   Вверх
boostcoder
Дата 6.3.2012, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(Gwynbleiddd @  5.3.2012,  21:39 Найти цитируемый пост)
printf("\n Received %d bytes,data\n[%s]\nfrom client\n",retval,totalbuf);

что выводится в консоль этой строкой?
PM WWW   Вверх
feodorv
Дата 6.3.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(boostcoder @  6.3.2012,  13:41 Найти цитируемый пост)
что выводится в консоль этой строкой?

+1

Слабо верится, что яндексовские куки ограничиваются одним yandexuid. 
Потом, HTTP работа с прокси немного отличается от прямого HTTP запроса.
Поэтому стОит взглянуть на полный запрос от браузера...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 6.3.2012, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(Gwynbleiddd @  5.3.2012,  21:39 Найти цитируемый пост)
 retval = recv((SOCKET)hostsocket, totalbuf, sizeof(totalbuf), 0); // Принимаем ответ хоста на посланный запрос
    if (retval == INVALID_SOCKET)
    {
        printf ("\nError Recv.");
        closesocket ((SOCKET)hostsocket);
    }

Ну так происходит одно-единственное чтение, а далее? И это при Keep-Alive???

Добавлено @ 15:57
Очень много ошибочного кода, с ним ещё разбираться и разбираться(((

Это сообщение отредактировал(а) feodorv - 6.3.2012, 16:10


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 6.3.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Короче, на данном этапе всё портит 118 строка:
Цитата(Gwynbleiddd @  5.3.2012,  21:39 Найти цитируемый пост)
        *(p+i)=0;

Лечится так:
Код

        char c = *(p+i);
        *(p+i)=0;
        strcpy(address,p); //копируем в переменную address наш указатель p, т.е. как раз адрес сервера
        *port=80;      //default http port
        *(p+i)=c;

 smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Gwynbleiddd
Дата 21.3.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Прошу прощения, остался без компьютера на 2 недели - только сейчас смог снова добраться до проекта.

1. Вот то, что выводиться в консоль строкой:
Код

printf("\n Received %d bytes,data\n[%s]\nfrom client\n",retval,totalbuf);


Код

 Received 430 bytes,data
[GET http://www.ya.ru/ HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60
Host: www.ya.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, imag
e/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Cookie: yandexuid=5594903511330216492
Cache-Control: no-cache
Connection: Keep-Alive

]
from client


2. Поправил в коде
Код

 char c = *(p+i);
        *(p+i)=0;
        strcpy(address,p); //копируем в переменную address наш указатель p, т.е. как раз адрес сервера
        *port=80;      //default http port
        *(p+i)=c;

Но ничего не изменилось, по-прежнему просто белая страница.

3. По поводу одного чтения функцией 
Код

retval = recv((SOCKET)hostsocket, totalbuf, sizeof(totalbuf), 0); // Принимаем ответ хоста на посланный запрос
    if (retval == INVALID_SOCKET)
    {
        printf ("\nError Recv.");
        closesocket ((SOCKET)hostsocket);
    }

А как тогда сделать так, чтобы чтение происходило до тех пор, пока сервер посылает ответ?

4. Как можно избавиться от ошибочного кода? 
Голова уже кругом, не понимаю как наконец сделать работающую программу. В какую сторону копать, на что обратить внимание, что передать?
Читал статьи по сетевому программированию, так же книгу Эффективное программирование TCP\IP Шнейдера - но везде либо самые основы по поводу использования функций accept, listen и т.д., либо совсем простые примеры типа эхо-сервера.
PM MAIL   Вверх
feodorv
Дата 22.3.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(Gwynbleiddd @  21.3.2012,  16:46 Найти цитируемый пост)
Поправил в коде
...
Но ничего не изменилось, по-прежнему просто белая страница.

Даже не знаю, что сказать. У меня весьма успешно что-то отображается... Правда, не yandex.ru, а ya.ru.


Цитата(Gwynbleiddd @  21.3.2012,  16:46 Найти цитируемый пост)
А как тогда сделать так, чтобы чтение происходило до тех пор, пока сервер посылает ответ?

Ох, для начала я бы посоветовал заняться заголовком Connection, чтобы исключить keep-alive. Во-воторых, стОит сделать цикл чтения-записи, пока есть данные. В-третьих, стОит подумать о многопоточности... Правда, тогда получается уже не простой прокси-сервер)))

Ну и, конечно, принтфов побольше, а то непонятно, что происходит.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Gwynbleiddd
Дата 25.3.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Спасибо, будем разбираться.

А ещё такой вопрос.

Есть допустим у нас буффер размера 4096 байт: recvbuf[4096].
Мы выполняем команду 

Код

char recvbuf2;
while ((retval = recv((SOCKET)hostsocket, &recvbuf2, sizeof(recvbuf2), 0)) != 0) 
    {
        recvbuf[i] = recvbuf2;
                ++i;
    }


Т.е. пока будут идти данные, мы будем записывать их в наш буффер. Но если размер ответа от сервера будет больше, чем 4096 байт? Увеличить первоначальный размер буффера? Или можно как-то более эффективно организовать приём ответа?


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0894 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.