recv не хочет принимать данные из сокета
От: 4LF  
Дата: 15.06.05 16:36
Оценка:
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++' — Павел Кузнецов
Re: recv не хочет принимать данные из сокета
От: butcher Россия http://bu7cher.blogspot.com
Дата: 16.06.05 04:16
Оценка:
Здравствуйте, 4LF, Вы писали:

4LF>при первом вызове все принимается... когда вызываю функцию второй раз recv сразу возвращает -1


Попробуйте получить код ошибки вместо возвращения false
Это многое прояснянит.. Как получить, зависит от ОС — WSAGetLastError (Windows), errno(UNIX).

Нет ничего невозможного..
Re: recv не хочет принимать данные из сокета
От: MaximE Великобритания  
Дата: 16.06.05 06:41
Оценка:
4LF wrote:

> 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 // проверки ошибок


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

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: recv не хочет принимать данные из сокета
От: sercher Украина  
Дата: 23.06.05 11:04
Оценка:
4LF>при первом вызове все принимается... когда вызываю функцию второй раз recv сразу возвращает -1

Сокет наверно в неблокирующем режиме?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: recv не хочет принимать данные из сокета
От: alexora  
Дата: 23.06.05 19:36
Оценка:
Здравствуйте, 4LF, Вы писали:

4LF>if (send(hSocket, query, (int)strlen(query), 0) == SOCKET_ERROR)


eto chto takoe ?
Re: recv не хочет принимать данные из сокета
От: 4LF  
Дата: 30.06.05 11:34
Оценка:
>Во-вторых, как у тебя реализовано чтение из сокета, оно выдет из цикла только в том
>случае, когда отправляющая сторона закроет сокет на запись или вообще разорвет
>соединение. Т.е. при последуещей попытке чтения ты получишь ошибку, т.к. ты
>попытаешься читать из соединения, в котором данных для чтения уже быть не может.

а как тогда организовать чтение данных??
Re[2]: recv не хочет принимать данные из сокета
От: MaximE Великобритания  
Дата: 30.06.05 11:44
Оценка:
Здравствуйте, 4LF, Вы писали:

>>Во-вторых, как у тебя реализовано чтение из сокета, оно выдет из цикла только в том

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

4LF>а как тогда организовать чтение данных??


Точно также, как если бы ты читал файл.

Тебе нужно как-то определять концы сообщений в потоке. Два стандартных варианта:

  1. Каждое сообщение в потоке предваряется 4-байтным заголовком с длиной сообщения. Вычитываешь заголовок, затем сообщение с длиной указанной в заголовке.
  2. Вычитываешь сообщение до тех пор пока не встретишь признак конца. Для HTTP заголовка это две пустых строки.
Re[3]: recv не хочет принимать данные из сокета
От: 4LF  
Дата: 30.06.05 12:36
Оценка:
ну на низком уровне можно узнать длину... а на обычном (AF_INET) есть что-нибудь или самому передавать?
Re[4]: recv не хочет принимать данные из сокета
От: 4LF  
Дата: 30.06.05 12:38
Оценка:
Здравствуйте, 4LF, Вы писали:

4LF>ну на низком уровне можно узнать длину... а на обычном >>(SOCK_STREAM)<< есть что-нибудь или самому передавать?
Re[4]: recv не хочет принимать данные из сокета
От: MaximE Великобритания  
Дата: 30.06.05 12:49
Оценка:
Здравствуйте, 4LF, Вы писали:

4LF>ну на низком уровне можно узнать длину... а на обычном (AF_INET) есть что-нибудь или самому передавать?


Для TCP длину придется передавать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.