if (send(hSocket, query, (int)strlen(query), 0) == SOCKET_ERROR)
{
cout <<"send error"<< '\n';
return false;
}
int len = 1;
result = "";
while ( len != 0 )
{
char buf[1024] = {0};
len = recv(hSocket, buf, 1023, 0);
if (len == SOCKET_ERROR)
return false;
result += buf;
}
сout << result;
при первом вызове все принимается... когда вызываю функцию второй раз recv сразу возвращает -1
16.06.05 01:24: Перенесено модератором из 'C/C++' — Павел Кузнецов
> if (send(hSocket, query, (int)strlen(query), 0) == SOCKET_ERROR)
> {
> cout <<"send error"<< '\n';
> return false;
> }
> int len = 1;
> result = "";
> while ( len != 0 )
> {
> char buf[1024] = {0};
> len = recv(hSocket, buf, 1023, 0);
> if (len == SOCKET_ERROR)
> return false;
> result += buf;
> }
> сout << result;
> при первом вызове все принимается... когда вызываю функцию второй раз recv сразу возвращает -1
Какое значение WsaGetLastError()?
Код чтения строки из сокета некорректен.
Во-первых, операция чтения из потокового сокета может вернуть полученные данные не за один вызов. Если строка была с нулевыми символами, то ты их можешь потерять.
Правильно так:
char buf[0x100]; // не зануляем буфер
len = recv(socket, buf, sizeof(buf), 0);
if(len > 0)
result.append(buf, n);
else// проверки ошибок
Во-вторых, как у тебя реализовано чтение из сокета, оно выдет из цикла только в том случае, когда отправляющая сторона закроет сокет на запись или вообще разорвет соединение. Т.е. при последуещей попытке чтения ты получишь ошибку, т.к. ты попытаешься читать из соединения, в котором данных для чтения уже быть не может.
>Во-вторых, как у тебя реализовано чтение из сокета, оно выдет из цикла только в том >случае, когда отправляющая сторона закроет сокет на запись или вообще разорвет >соединение. Т.е. при последуещей попытке чтения ты получишь ошибку, т.к. ты >попытаешься читать из соединения, в котором данных для чтения уже быть не может.
Здравствуйте, 4LF, Вы писали:
>>Во-вторых, как у тебя реализовано чтение из сокета, оно выдет из цикла только в том >>случае, когда отправляющая сторона закроет сокет на запись или вообще разорвет >>соединение. Т.е. при последуещей попытке чтения ты получишь ошибку, т.к. ты >>попытаешься читать из соединения, в котором данных для чтения уже быть не может.
4LF>а как тогда организовать чтение данных??
Точно также, как если бы ты читал файл.
Тебе нужно как-то определять концы сообщений в потоке. Два стандартных варианта:
Каждое сообщение в потоке предваряется 4-байтным заголовком с длиной сообщения. Вычитываешь заголовок, затем сообщение с длиной указанной в заголовке.
Вычитываешь сообщение до тех пор пока не встретишь признак конца. Для HTTP заголовка это две пустых строки.