powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
25 сообщений из 178, страница 7 из 8
recv выход из цикла
    #39711684
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneSergey_rbпропущено...


Я уже понял, что аналог ReadStrings мне не написать.
Сделал новый сервер, который отправляет ответы через WriteLn.О как. И каким образом это решает проблему с определением длины?
На самом деле, совсем не обязательно ReadStrings переводить буквально построчно. Надо просто достать из первых четырех байт полученного буфера количество строк. И читать дальше, считая переводы строк.

Считал я эти 4 байта, в них число 0000
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711686
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbВсе они связаны с возникновением ошибок, а не с завершением приема данных

И это правильно, потому что завершение приёма данных сигнализируется возвращаемым
значением, бОльшим нуля. БОЛЬШИМ!


А выход из цикла происходит при значении меньше нуля.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711688
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneSergey_rbпропущено...


Я уже понял, что аналог ReadStrings мне не написать.
Сделал новый сервер, который отправляет ответы через WriteLn.О как. И каким образом это решает проблему с определением длины?
На самом деле, совсем не обязательно ReadStrings переводить буквально построчно. Надо просто достать из первых четырех байт полученного буфера количество строк. И читать дальше, считая переводы строк.
Ну так он и первые 4 байта точно так же по частям может принимать, и всё - смерть, разруха, разочарование и т.п.
Он не знает, как данные собирать.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711690
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbпропущено...


Я уже понял, что аналог ReadStrings мне не написать.
Сделал новый сервер, который отправляет ответы через WriteLn.
Почему же ты книжку не посмотришь, там и сервер и клиент без инди, несколько вариантов. Ничего сложного, хоть на паскале хоть на си...

Книжка неправильная, в ней написано, что TCP протокол передает данные пакетами, но мне здесь упорно пытаются доказать, что это не так.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711692
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

почему ты книжку почитать не хочешь? Тебе личное общение нравится?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbА выход из цикла происходит при значении меньше нуля.

"Пони бегает по кругу и в уме круги считает..." (с)

Именно поэтому в приведённом мною ПРАВИЛЬНОМ коде обработка данных производится
ВНУТРИ цикла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711694
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Почему же ты книжку не посмотришь, там и сервер и клиент без инди, несколько вариантов. Ничего сложного, хоть на паскале хоть на си...

Книжка неправильная, в ней написано, что TCP протокол передает данные пакетами, но мне здесь упорно пытаются доказать, что это не так.
Ты или лживый тролль, или совсем уж тупой.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711697
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbBarloneпропущено...
О как. И каким образом это решает проблему с определением длины?
На самом деле, совсем не обязательно ReadStrings переводить буквально построчно. Надо просто достать из первых четырех байт полученного буфера количество строк. И читать дальше, считая переводы строк.

Считал я эти 4 байта, в них число 0000Серьезно? Тут уже просили дамп полученного пакета в студию.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711699
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbпропущено...


Книжка неправильная, в ней написано, что TCP протокол передает данные пакетами, но мне здесь упорно пытаются доказать, что это не так.
Ты или лживый тролль, или совсем уж тупой.

Выдержка из книги

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

Но самое неудобное то, что пакеты не только склеиваются, но и разбиваются на части. Принимающая сторона может получить пакет меньшего размера, чем отправленный, если этот пакет был послан по частям, и на момент его чтения принимающей стороной еще не все части были получены. Тогда приходится повторять операцию чтения данных, пока не будет получено все, что нужно.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711702
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВыдержка из книги

И какое место из этой выдержки ты прочитал как "TCP протокол передает данные пакетами"?
Только не говори, что это "TCP склеивает данные в один поток".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711710
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаем дальше

Функция, которая читает из сокета
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
// Функция читает Cnt байтов в буфер Buffer из сокета S

// Учитывается, что может потребоваться несколько операций чтения,

// прежде чем будет прочитано нужное число байтов.

// Возвращает:

// 1 - в случае успешного чтения

// 0 - в случае корректного закрытия соединения удаленной стороной

// -1 - в случае ошибки чтения

function ReadFromSocket(S: TSocket; var Buffer; Cnt: Integer): Integer;

var

Res, Total: Integer;

begin

// Total содержит количество принятых байтов

Total := 0;

// Читаем байты в цикле до тех пор, пока не будет прочитано Cnt байтов

repeat

// На каждой итерации цикла нам нужно прочитать

// не более чем Cnt - Total байтов, т.е. не более

// чем нужное количество минус то, что уже прочитано

// на предыдущих итерациях. Очередную порцию данных

// помещаем в буфер со смещением Total.

Res := recv(S, (PChar(@Buffer) + Total)^, Cnt - Total, 0);

if Res = 0 then

begin

// Соединение закрыто удаленной стороной

Result := 0;

Exit;

end;

if Res < 0 then

begin

// Произошла ошибка при чтении

Result := -1;

Exit;

end;

Inc(Total, Res);

until Total >= Cnt;

Result:= 1;

end;




Обратим внимание на заголовок
Код: plaintext
1.
function ReadFromSocket(S: TSocket; var Buffer; Cnt: Integer): Integer;



В функцию надо передать количество байт, которое должно быть считано.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711719
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЧитаем дальше

Зачем ты хочешь чтобы мы читали этот букварь? Так всё написано правильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711726
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Ты или лживый тролль, или совсем уж тупой.

Выдержка из книги

автор...
Но самое неудобное то, что пакеты не только склеиваются, но и разбиваются на части. Принимающая сторона может получить пакет меньшего размера, чем отправленный, если этот пакет был послан по частям, и на момент его чтения принимающей стороной еще не все части были получены. Тогда приходится повторять операцию чтения данных, пока не будет получено все, что нужно.
И какой же вывод? А вывод такой, что до внутренней организации тебе дела никакого нет. Ты принимаешь данные по мере их поступления, порциями произвольной, не зависящей от тебя длины. ТАК СДЕЛАНО потому что, тут нет место твоим желаниям и страданиям.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711736
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Мне кажется, что ТС просто троллит.

Кого тут троллить?
Вижу только раздувание щек от собственной значимости, хотя так никто и не предложил правильного решения.
Ты сообщаешь только то считаешь нужным сообщить, извини, но телепатов тут нет чтобы угадать недостающее. Уже 100500 раз назвали все возможные источники твоей проблемы, а ты вместо того чтобы давать уточнения продолжаешь нести пургу.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711741
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


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

Я выложил дампы для анализа.
Где результат этого анализа?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711742
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

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

Я выложил дампы для анализа.
Где результат этого анализа?
Где выложил?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711746
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

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

Я выложил дампы для анализа.
Где результат этого анализа?
Ты не выкладывал. Ошибся форумом?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711747
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если под дампом ты понимаешь это
Sergey_rbВот это более правильное сообщение, заканчивается двумя переводами строки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
|OnChangeState|1097|1204|
|OnChangeState|1176|1284|
|OnChangeState|1196|1303|
|OnChangeState|1204|1310|
|OnChangeState|1216|1323|
|OnChangeState|1259|1343|
|OnChangeState|1316|1403|


то где там 4 байта о которых ты писал
Sergey_rbСчитал я эти 4 байта, в них число 0000

В общем это не дамп, а недоразумение.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711749
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


Я выложил дампы для анализа.
Где результат этого анализа?
Где выложил?

На предыдущей странице.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711753
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbНа предыдущей странице.
Нет там ничего.

Удачи в поисках решения. Желание помочь было, но ты его напрочь отбил своим упорством.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712100
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Почему же ты книжку не посмотришь, там и сервер и клиент без инди, несколько вариантов. Ничего сложного, хоть на паскале хоть на си...

Книжка неправильная, в ней написано, что TCP протокол передает данные пакетами, но мне здесь упорно пытаются доказать, что это не так.
Мне учитель школьной физики говорил что свет - это элекромагнитные волны. А другой учитель
универа - что фотоны. Даже не знаю что с этим делать.

Как думаешь?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712137
Igor Barchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

5 страниц флуда...

Отвечая на твой вопрос в первом сообщении ветки:
чтобы организовать неблокирующее чтение в цикле из сокета надо почитать про функцию select, позволяющую организовать мониторинг нескольких сокетов по разным событиям - включая объем готовых для чтения байт в буфере, тогда recv не завершиться блокировкой. Дальше складирование прочитанного в буфер и анализ его - полное сообщение(строка, фикс длина, маркеры - это уж как протокол устроен) пришло или нет. И дальше ожидание проверка необходимости выхода из цикла, или разбор событий винды или что там еще тебе нужно в не заблокированном цикле, например выход из него.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712143
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDimitry SibiryakovВ том, который описан в документации по recv(), которую надо читать.


Читаем описание

авторФункция recv

Функция служит для чтения данных из сокета.

Прототип:

int recv(int s, char * buf, int len, int flags);

Первый аргумент - сокет-дескриптор, из которого читаются данные. Второй и третий аргументы - соответственно, адрес и длина буфера для записи читаемых данных. Четвертый параметр - это комбинация битовых флагов, управляющих режимами чтения. Если аргумент flags равен нулю, то считанные данные удаляются из сокета. Если значение flags есть MSG_PEEK, то данные не удаляются и могут быть считаны последущим вызовом ( или вызовами ) recv.

Функция возвращает число считанных байтов или -1 в случае ошибки . Следует отметить, что нулевое значение не является ошибкой. Оно сигнализирует об отсутствии записанных в сокет процессом-поставщиком данных.


Это ты плохое описание нашёл. Там не только -1 возвращается, но и другие отрицательные величины тоже.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712144
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Почему же ты книжку не посмотришь, там и сервер и клиент без инди, несколько вариантов. Ничего сложного, хоть на паскале хоть на си...

Книжка неправильная, в ней написано, что TCP протокол передает данные пакетами, но мне здесь упорно пытаются доказать, что это не так.

Блин, сколько ж можно как баран твердить про пакеты?
Нет пакетов в TCP/IP.
НЕТУ
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712146
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Ты или лживый тролль, или совсем уж тупой.

Выдержка из книги

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

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

И какую ж макулатуру ты тут цитируешь?
...
Рейтинг: 0 / 0
25 сообщений из 178, страница 7 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]