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