Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2011, 12:56   #1
k3feel
Новичок
Джуниор
 
Регистрация: 24.02.2011
Сообщений: 1
Вопрос OpenSSL / Проблема с использованием keep alive соединения

Написал маленький клиент, который общается с сервером по средством 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: посылать меня кудато нет смысла - я уже везде был, нигде пока ответа не нашел =\
k3feel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Немогу установить OpenSSl 0.9.7b L11L Софт 1 19.07.2010 20:14
Проверка соединения с интернетом. Проблема Djem1991 Работа с сетью в Delphi 12 10.06.2010 22:02
Проблема соединения с базой MySQL Blade БД в Delphi 3 08.05.2009 04:25
OpenSSL помогите разобраться Thunderstorm Работа с сетью в Delphi 0 11.07.2008 10:37
Проблема соединения с MySQL через ODBC yakovlev87 БД в Delphi 1 27.08.2007 09:51