The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"OpenSSL / Проблема с использованием keep alive соединения"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Сеть, сокеты)
Изначальное сообщение [ Отслеживать ]

"OpenSSL / Проблема с использованием keep alive соединения"  +/
Сообщение от k3feel (ok) on 18-Фев-11, 17:25 
Написал маленький клиент, который общается с сервером по средством OpenSSL.
Добавил возможность создавать защищенные соединения(ssl-connection).
Все работало замечательно. Но потом озадачился вопрос производительности и дабы ускорить "общение" клиента с сервером решил добавить возможность использования keep alive.
Для SSL соединений все удалось настроить, все замечательно, а вот для обычных ни как:

1. посылаю запрос

"POST //G/page HTTP/1.0
Host: kenny
Connection: keep-alive
Keep-Alive: 300
Content-type: application/x-www-form-urlencoded
Content-length: 11

action=misc"

2. получаю ответ

"HTTP/1.1 200 OK
Server: nginx/0.6.35
Date: Fri, 18 Feb 2011 14:09:27 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 140
Expires: Fri, 18 Feb 2011 14:09:26 GMT
Cache-Control: no-cache

<?xml version="1.0" encoding="UTF-8"?>
..."

3. пробую снова отослать 1 запрос
4. но ответа уже не получаю BIO_read возвращает 0

вот код:

...
ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
SSL_library_init();

BIO * bio = 0;
bio = BIO_new_connect(ADDRESS":"PORT);
if(bio == NULL)
{
    return 0;
}

if(BIO_do_connect(bio) <= 0)
{
    return 0;
}

// пробую послать запрос
ret = BIO_write(bio, request,reqLen);

size_t bufSize = 1024*1024;
char* buf = new char[bufSize];
size_t readedSize = 0;

// пробую прочитать ответ
for(;;)
{
    p = BIO_read(bio, buf+readedSize, bufSize-readedSize);
    if(p>0)
    readedSize += p;
    if(p==0)
    {
        buf[readedSize] = 0;
        break;
    }
    else if(p < 0)
    {
        ret = BIO_should_retry(bio);
        if(!ret)
        {
            buf[readedSize] = 0;
            break;
        }
        continue;
    }
    else if(bufSize<=readedSize)
    {
        buf[bufSize-1] = 0;
    }
}

// пробую повторно послать запрос по keep alive соединеню
ret = BIO_write(bio, request,reqLen); // возвращает адекватное число
readedSize = 0;
// пробую прочитать ответ на повторный запрос
for(;;)
{
    p = BIO_read(bio, buf+readedSize, bufSize-readedSize); // возвращает 0
    if(p>0)
    readedSize += p;
    if(p==0)
    {
        buf[readedSize] = 0;
        break;
    }
    else if(p < 0)
    {
        ret = BIO_should_retry(bio);
        if(!ret)
        {
            buf[readedSize] = 0;
            break;
        }
        continue;
    }
    else if(bufSize<=readedSize)
    {
        buf[bufSize-1] = 0;
    }
}
...

ВОПРОС:
Что я делаю не так? Может кто то уже сталкивался с аналогичной проблемой.
ps: посылать меня кудато нет смысла - я уже везде был, нигде пока ответа не нашел =\

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "неясная формулировка"  +/
Сообщение от Вова on 19-Фев-11, 09:37 
а в чём вопрос?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "неясная формулировка"  +/
Сообщение от k3feel (ok) on 20-Фев-11, 22:26 
> а в чём вопрос?

В чем может быть загвоздка? Почему соединение фактически закрывается уже после получения ответа на первый запрос, хотя тип соединения указан как keep alive?
Есть какие-нибудь сооброжения?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру