C++ сокеты, получение данных с помощью recv

программирование С++ сокеты динамические данные recv

Вообщем, в C++ вродекак разобрался с сокетами, но не совсем. Проблема состоит в том, что данные с другого сервера всё-время меняются, размер данных может быть как и 1 кбайт, так и несколько мегабайт. При recv, допустим, мы читаем первые 32 байта, далее ещё 32, но данные получаются несогласованные. Собстно вопрос, как быть?
P.S. Csocket* sock = new Csocket();
if (sock->open(SOCK_STREAM, true) == INVALID_SOCKET)
return "Error"
if (sock->connect(Csocket::get_host((const std::string&)http_host), htons(port_num)) == SOCKET_ERROR)
return "Error";
std::string h = "GET /" + http_path;
h += "some headers;"
std::string resp;
if (sock->send(const_memory_range(h)) == SOCKET_ERROR)
return "Error";
int r = sock->recv(resp);
if (r == SOCKET_ERROR)
return "Error";
sock->close();

P.S.S. Csocket - из XBT, и:
int Csocket::recv(std::string& d) const {
const int size = 4096;
int ret;
char c[size];
do {
ret = ::recv(*this, c, size - 1, MSG_WAITALL);
if (ret > 0) {
c[ret] = '\0';
d += c;
}
} while (ret > 0);
return ret;
}

Примечание:
Всмысле, доп. сервер первый раз должен был отдать aaaaaaaaaaaaaaaaaa...., а второй раз bbbbbbbbbbb....
Мы получили первые 32 байта: aaaaaaaa
Потом ещё 32 байта, но уже bbbbbbbb
В сумме получилось aaaaaaaabbbbbbbb

Примечание:
Вообщем, переписал через стандартную библиотеку - всё заработало. мистика :)
Ответы:
в смысле несогласованные? что они не собираются?
>Вообщем, переписал через стандартную библиотеку - всё заработало. мистика :)
Ну...скажем так стандартная библиотека на то и сделана, чтобы все работало:) Это не мистика, это правильные велосипеды.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.