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

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

Пример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	while (res>0)
	{	
	res = recv(sock, rbuff, sizeof(rbuff), 0);    

	tmp = cp1251toUtf8(rbuff,res);

	}



Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке

Код: plaintext
1.
	res = recv(sock, rbuff, sizeof(rbuff), 0);    



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

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

почитай про setsockopt и опцию SO_RCVTIMEO
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709685
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОдно из двух:
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер.
2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер.

Обычно делают по первому варианту.

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

Делаешь сокет O_NONBLOCK и читаешь в цикле пока recv не вернёт ошибку EWOULDBLOCK
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709736
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbесть проблема чтения данных из сокета, а именно - протокол TCP/IP передает поток байтов от сервера к клиенту пакетами.


Нет, ты ошибаешься, передача TCP идёт потоком. Пакетов никаких нет.


авторРазмер пакетов имеет разную длину, которые помещаются в буфер, из которого функция recv и считывает данные

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

Пример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	while (res>0)
	{	
	res = recv(sock, rbuff, sizeof(rbuff), 0);    

	tmp = cp1251toUtf8(rbuff,res);

	}



Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке

Код: plaintext
1.
	res = recv(sock, rbuff, sizeof(rbuff), 0);    



Какие есть варианты выхода из цикла?

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

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

"Неправильно ты, дядя Фёдор, бутерброд ешь."
Надо говорить так: "протокол TCP/IP передает поток байтов". Точка. Никакого разделения на
"пакеты", видимые прикладному уровню, в нём нет.

Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания
следующего пакета.

Это не проблема. Проблема в том, что ты принятые байты не обрабатываешь сразу по принятии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709774
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSergey_rbесть проблема чтения данных из сокета, а именно - протокол TCP/IP передает поток байтов от сервера к клиенту пакетами.


Нет, ты ошибаешься, передача TCP идёт потоком. Пакетов никаких нет.


авторРазмер пакетов имеет разную длину, которые помещаются в буфер, из которого функция recv и считывает данные

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

Пример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	while (res>0)
	{	
	res = recv(sock, rbuff, sizeof(rbuff), 0);    

	tmp = cp1251toUtf8(rbuff,res);

	}



Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке

Код: plaintext
1.
	res = recv(sock, rbuff, sizeof(rbuff), 0);    



Какие есть варианты выхода из цикла?

recv возвращает отрицательное число при закрытии сокета и прочих проблемах.
Вот это и надо проверять.
Всё это есть в документации.

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

Обычно делают по первому варианту.

Первый вариант не подходит, а второй можно попробовать

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

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

Поэтому-то твой цикл и не завершается. Обрабатывая данные внутри него.


Не закрывается, потому что так устроен обмен.

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

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

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


Я их обрабатываю
Мне надо знать, когда функция recv считала последний пакет.

проверка на количество считанных байтов не подходит, т.к. оно больше 0
Проверка на наличие символа \n тоже не прокатывает, т.к. в пакете есть символы перевода строки.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709833
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В INDY сначала считывается количество полученных строк, затем считываются строки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TIdTCPConnection.ReadStrings(var AValue: TStrings; AReadLinesCount: Integer = -1);
Var
  i: Integer;
begin
  if AReadLinesCount <= 0 then begin
    AReadLinesCount := ReadInteger;
  end;
  for i := 0 to AReadLinesCount - 1 do begin
    AValue.Add(ReadLn);
  end;
end;
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709849
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbМне надо знать, когда функция recv считала последний пакет.

Не существует в природе никакого "последнего пакета". За исключением того, после которого
соединение закрывается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709851
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВ INDY сначала считывается количество полученных строк

Значит инди сначала передаёт количество передаваемых строк. О чём тебе и говорили:
передавай длину данных перед самими данными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709855
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbМне надо знать, когда функция recv считала последний пакет.

Не существует в природе никакого "последнего пакета". За исключением того, после которого
соединение закрывается.


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

Значит инди сначала передаёт количество передаваемых строк. О чём тебе и говорили:
передавай длину данных перед самими данными.


Не могу я менять алгоритм работы сервера, т.к. на нем крутятся терминалы
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда ничего не поделаешь, придётся применять мозг или нанимать программиста.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39709975
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу тогда ничего не поделаешь, придётся применять мозг или нанимать программиста.


Так где же взять этого программиста?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710008
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локализовал проблему - при получении 2-х пакетов, теряется первый пакет, т.е. функция выдает к-то байт, но сам буфер пустой.
Поставил
Код: plaintext
1.
Sleep(100)



Не помогло.

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

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

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


если речь идет о этой строке,

авторtmp = cp1251toUtf8(rbuff,res);


То я выложил не всю обработку
Код: plaintext
1.
2.
			tmp = cp1251toUtf8(rbuff,res);
			line.append(tmp);




Первый пакет теряется даже в случает двух вызовов recv

Код: 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.
		res_total=recv(sock, rbuff, sizeof(rbuff), 0);

		wsprintf(t2, L" res_total = %d", res_total);

		::MessageBoxW(NULL,t2, L"GetStrings", MB_ICONEXCLAMATION | MB_OK);

		i=strlen(rbuff);
		wsprintf(t2, L" strlen = %d", i);

		::MessageBoxW(NULL,t2, L"Buf len", MB_ICONEXCLAMATION | MB_OK);

		tmp = cp1251toUtf8(rbuff,sizeof(rbuff));
		::MessageBoxW(NULL,tmp.c_str(), L"GetStrings total result", MB_ICONEXCLAMATION | MB_OK);

		 res = recv(sock, rbuff, sizeof(rbuff), 0);

		i=strlen(rbuff);
		wsprintf(t2, L" strlen = %d", i);

		::MessageBoxW(NULL,t2, L"GetStrings", MB_ICONEXCLAMATION | MB_OK);


		tmp = cp1251toUtf8(rbuff,sizeof(rbuff));

//		wstr = cp1251toUtf8((const char *)  rbuff, res); 		

		::MessageBoxW(NULL,tmp.c_str(), L"GetStrings result", MB_ICONEXCLAMATION | MB_OK);

		line.append(tmp);
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710076
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbПервый пакет теряется даже в случает двух вызовов recv

Это очередной псевдокод или этот бред реально написан в программе? Он в принципе не
работоспособен от "strlen()" и ниже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710094
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbПервый пакет теряется даже в случает двух вызовов recv

Это очередной псевдокод или этот бред реально написан в программе? Он в принципе не
работоспособен от "strlen()" и ниже.


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

Это бредовый код, который по определению не может работать.

Sergey_rb
Код: sql
1.
i=strlen(rbuff);


Ага, щаззз. В буфере лежит просто пачка байт уже известной длины, а не null-terminated
string. Только stupid luck не позволяет тебе получить AV в этом месте.

Sergey_rb
Код: sql
1.
cp1251toUtf8(rbuff,sizeof(rbuff));


recv() занёс в буфер килобайтной длины три байта, но ты упорно пытаешься перекодировать
весь килобайт. Ню-ню...

Ниже этот бред повторён два раза.

Sergey_rb
Код: sql
1.
line.append(tmp);


Угу, из двух принятых кусков ты добавляешь к строке только последний и удивляешься куда
пропал первый. "Поздравляю, Шарик..." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710109
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка
Код: plaintext
1.
i=strlen(rbuff);



Действительно выдает длину строки, т.к. сервер выдает нул терминатед строку


Код: plaintext
1.
cp1251toUtf8(rbuff,sizeof(rbuff));



Если в буфере есть данные, то они конвертируются и выводятся в сообщении

Код: plaintext
1.
line.append(tmp);



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

То, что сервер её выдаёт, ещё не значит, что она дойдёт до тебя вся за один recv(). Ты
можешь получить первые пять байт сейчас, ещё два байта потом и последний байт когда-нибудь.

Sergey_rbЕсли в буфере есть данные, то они конвертируются и выводятся в сообщении

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

ты вроде как паскалист? Найди и скачай книгу: Антон Григорьев "О чем не пишут в книгах по Delphi"
Там есть отдельная глава, где подробно и понятно описана работа с tcp и достаточно примеров рабочего кода.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710160
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Дельфи у меня все давно написано, сервер и терминалы работают по TCP уже лет пять.

Но один му**ло купил партию терминалов с WinCe7, на которой Паскаль программы не запускаются.

Теперь, чтобы исправить его косяк, мне надо написать прогу под WinCe7 на каком-то другом языке.

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

Но один му**ло купил партию терминалов с WinCe7, на которой Паскаль программы не запускаются.

Теперь, чтобы исправить его косяк, мне надо написать прогу под WinCe7 на каком-то другом языке.

Единственная среда разработки под WinCe, которая не зависит от версии винды, это древний Embedded C++, который работает у меня на виртуальной машине под WinXP, потому что на более новых версиях он не работает.
Ты какую-то лишнюю инфу выдаешь. При чем тут XP, виртмашины, кто там что купил?

Если нужно на другом языке работать - куда деваться. И никакой разницы - паскаль, не паскаль. Работа с tcp сокетами не зависит от языка.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710186
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияРабота с tcp сокетами не зависит от языка.

Мышевозники и компонентокидатели испытывают определённые трудности при переходе от
использования готовых фреймворков к настоящему программированию. В Дельфи за аффтара всё
делало INDY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710188
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКотовасияРабота с tcp сокетами не зависит от языка.

Мышевозники и компонентокидатели испытывают определённые трудности при переходе от
использования готовых фреймворков к настоящему программированию. В Дельфи за аффтара всё
делало INDY.

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


Предает набор строк

На клиенте
Код: pascal
1.
ReadStrings


Получает набор строк и запихивает в StringList.

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

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

авторЧто такое протоколы TCP/IP

TCP — Transfer Control Protocol. Протокол управления передачей. Он служит для обеспечения и установление надежного соединения между двумя устройствами и надежную передачу данных. При этом протокол TCP контролирует оптимальный размер передаваемого пакета данных , осуществляя новую посылку при сбое передачи.

IP — Internet Protocol. Интернет протокол или адресный протокол — основа всей архитектуры передачи данных. Протокол IP служит для доставки сетевого пакета данных по нужному адресу. При этом информация разбивается на пакеты , которые независимо передвигаются по сети до нужного адресата.


https://webonto.ru/protokolyi-tcp-ip-prostyim-yazyikom/
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710959
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

а это тебя в общем случае не касается, как там данные передаются. Тебя касается лишь то, как ты данные получаешь с помошью твоего api.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710961
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДля тех, кто не верит, что TPC/IP передает данные пакетами.
А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710996
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbДля тех, кто не верит, что TPC/IP передает данные пакетами.
А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

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

А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

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

а это тебя в общем случае не касается, как там данные передаются. Тебя касается лишь то, как ты данные получаешь с помошью твоего api.

Я получаю функцией recv и она может вернуть как сообщение целиком, так и часть сообщения.

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


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

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

А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

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


Как определить, что пришла только часть сообщения?
Я вторым постом написал как 21688779 , но ты не веришь и упорно ищешь несуществующий способ.


авторОдно из двух:
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер.
2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер.


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

Я вторым постом написал как 21688779 , но ты не веришь и упорно ищешь несуществующий способ.


авторОдно из двух:
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер.
2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер.


1. Да, передается размер, но это размер не всего сообщения, а текущего пакета.
2. Что за маркер, это какой-то специальный символ?
1. О каком размере речь? О том что recv() вернул? Я про то чтобы сервер сначала передал размер данных, а затем сами данные.
2. Да, символ (или последовательность символов) заведомо не использующийся внутри сообщения. Например в протоколе HTTP конец заголовка это два перевода строки подряд.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711040
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...



пропущено...



1. Да, передается размер, но это размер не всего сообщения, а текущего пакета.
2. Что за маркер, это какой-то специальный символ?
1. О каком размере речь? О том что recv() вернул? Я про то чтобы сервер сначала передал размер данных, а затем сами данные.
2. Да, символ (или последовательность символов) заведомо не использующийся внутри сообщения. Например в протоколе HTTP конец заголовка это два перевода строки подряд.

1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы
2.Два перевода строки подряд могут быть в любом тексте.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711043
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для общего развития: допустим ты передал строку
Код: plaintext
В лесу родилась елочка
при передаче строка была разбита на пакеты
Код: plaintext
   1   |   2   |   3   |

TCP гарантирует что эти 3 пакета придут именно в той последовательности, как ты отправил, т.е. 2-й не придет раньше 1-го, но НЕ гарантирует что ты получишь все 3 вместе, т.е. может прийти например 1-й, а затем 2,3 вместе.

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

Алгоримом. В книжке, упомянутой мной ранее, есть эти алгоритмы.
Ты нашел, скачал, изучил, но не понял?

Причем здесь Дельфи?
Да, при чем?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711047
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы
Что мешает работать по аналогии с терминалом?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711053
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля общего развития: допустим ты передал строку
Код: plaintext
В лесу родилась елочка
при передаче строка была разбита на пакеты
Код: plaintext
   1   |   2   |   3   |

TCP гарантирует что эти 3 пакета придут именно в той последовательности, как ты отправил, т.е. 2-й не придет раньше 1-го, но НЕ гарантирует что ты получишь все 3 вместе, т.е. может прийти например 1-й, а затем 2,3 вместе.

Это один из вариантов. В реальности пакет побольше ~1.5 кб, и может быть наоборот ситуация, когда в одном пакете несколько строк или начало в одном пакете, а конец в другом.

И как мне это собрать в правильную последовательность строк?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711056
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rb1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы
Что мешает работать по аналогии с терминалом?

Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711066
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фееричный топик.
Почему-то в последнее время я видел несколько похожих проблем вокруг себя.
Да и сам (как ни странно) решаю сейчас аналогичную.

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

Что же это, нашествие телепузиков в индустрию?

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

Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета.


Это нормальное поведение этой фукнции. Так и должно быть.


Sergey_rbПример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	while (res>0)
	{	
	res = recv(sock, rbuff, sizeof(rbuff), 0);    

	tmp = cp1251toUtf8(rbuff,res);

	}



Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке



Это тоже нормально, и цикл нормальный.

Sergey_rbКакие есть варианты выхода из цикла?


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

Когда клиент завершает соединение, он закроет сокет, и твой recv вернёт что-то меньше 0-ля и твой цикл завершится.
После этого ты должен закрыть серверный сокет , возможно, что-то ещё освободить и завершить с серверной стороны,
и завершить серверный поток (либо сокет убрать из числа обрабатываемых).

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

Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета.


Это нормальное поведение этой фукнции. Так и должно быть.


Sergey_rbПример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	while (res>0)
	{	
	res = recv(sock, rbuff, sizeof(rbuff), 0);    

	tmp = cp1251toUtf8(rbuff,res);

	}



Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке



Это тоже нормально, и цикл нормальный.

Sergey_rbКакие есть варианты выхода из цикла?


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

Когда клиент завершает соединение, он закроет сокет, и твой recv вернёт что-то меньше 0-ля и твой цикл завершится.
После этого ты должен закрыть серверный сокет , возможно, что-то ещё освободить и завершить с серверной стороны,
и завершить серверный поток (либо сокет убрать из числа обрабатываемых).

А что же ты хочешь в твоём вопросе -- не понятно вообще.

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

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

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


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

ОБРАБАТЫВАЙ ПРИНЯТЫЕ ДАННЫЕ ВНУТРИ ЦИКЛА по мере их поступления.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711105
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После обработки последнего пакета, recv ничего не возвращает, а ждет новый пакет.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711106
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Что мешает работать по аналогии с терминалом?

Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками.
Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv().

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


Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками.
Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv().

Наверно где-то есть описание протокола обмена, т.е. описание в каком формате сервер дает ответ, надо только поискать.
Если нет, то запиши входящие данные в файл и смотри что там "лишнее", т.к. лишней там будет вспомогательная инфа для определения границ сообщений.

Я прекрасно знаю, в каком формате передается информация с сервера, т.к. я сам его написал.
А передается она в виде строк, разделенными символами переноса строк 13 и 10.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711110
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv().

Наверно где-то есть описание протокола обмена, т.е. описание в каком формате сервер дает ответ, надо только поискать.
Если нет, то запиши входящие данные в файл и смотри что там "лишнее", т.к. лишней там будет вспомогательная инфа для определения границ сообщений.

Я прекрасно знаю, в каком формате передается информация с сервера, т.к. я сам его написал.
А передается она в виде строк, разделенными символами переноса строк 13 и 10.

ОЛЛО!

ОБРАБАТЫВАЙ ПРИНЯТЫЕ ДАННЫЕ ВНУТРИ ЦИКЛА по мере их поступления.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711112
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbТерминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками.
Как функция в лазарусе называется? Если исходники той проги есть, то покажи как прием прописан, быстрее помогут на С++ переписать.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711114
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbТерминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками.
Как функция в лазарусе называется? Если исходники той проги есть, то покажи как прием прописан, быстрее помогут на С++ переписать.

Это я тоже уже писал на предыдущей странице

авторВ Indy все просто -
На сервере
WriteStrings


Предает набор строк

На клиенте
ReadStrings


Получает набор строк и запихивает в StringList.

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


Предает набор строк

На клиенте
ReadStrings


Получает набор строк и запихивает в StringList.

И никаких циклов, потерь данных и прочего мусора.
Я так подозреваю что все циклы и прочий "мусор" спрятаны внутри этих функций. Подобные вещи не стандартизированы, поэтому за пределами твоего Indy это не работает и надо разбираться как оно реально устроено в Indy.

Сделай WriteStrings() двух строк "123" и "abc", прими recv() все что придет, запиши в файл и выложи сюда этот файл.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711127
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд, но это уже совсем лоховская тема.
Я это не предлагал. Это был пример как отделен заголовок в протоколе HTTP. У тебя не HTTP, поэтому не надо искать то чего нет.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711130
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЭто я тоже уже писал на предыдущей странице

Писать-то ты горазд, но вот заглянуть в исходники WriteStrings() и прочитать их - тебе уже
не по плечу.

Sergey_rbВозможно, единственный выход - это, как было предложено, искать два
переноса строк подряд
С какого перепою ты решил, что твой сервер следует соглашениям HTTP?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711131
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...

Я так подозреваю что все циклы и прочий "мусор" спрятаны внутри этих функций. Подобные вещи не стандартизированы, поэтому за пределами твоего Indy это не работает и надо разбираться как оно реально устроено в Indy.

Сделай WriteStrings() двух строк "123" и "abc", прими recv() все что придет, запиши в файл и выложи сюда этот файл.

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

Да, именно так работает TCP и именно это тебе твердят с самого начала. Но до тебя никак не
доходит. Видимо, твой мозг работает по UDP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711135
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbЭто я тоже уже писал на предыдущей странице

Писать-то ты горазд, но вот заглянуть в исходники WriteStrings() и прочитать их - тебе уже
не по плечу.

Sergey_rbВозможно, единственный выход - это, как было предложено, искать два
переноса строк подряд
С какого перепою ты решил, что твой сервер следует соглашениям HTTP?


1. Смотрел, там сначала берется количество строк, затем они считываются.
2. Я писал, что использую протокол HTTP?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711136
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд, но это уже совсем лоховская тема.

Ты хотя бы ПЕРВЫЙ ПЕРЕНОС СТРОК НАЙДИ , блин...
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711138
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbПроблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.

Да, именно так работает TCP и именно это тебе твердят с самого начала. Но до тебя никак не
доходит. Видимо, твой мозг работает по UDP.


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

Я так подозреваю что все циклы и прочий "мусор" спрятаны внутри этих функций. Подобные вещи не стандартизированы, поэтому за пределами твоего Indy это не работает и надо разбираться как оно реально устроено в Indy.

Сделай WriteStrings() двух строк "123" и "abc", прими recv() все что придет, запиши в файл и выложи сюда этот файл.

Для небольших сообщений, менее 2 Кб все прекрасно работает, т.к. это сообщения помещаются в один пакет.
Проблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.
Ты хочешь проблему решить или доказать что она нерешаемая? Если первое - сделай то что я попросил сделать.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbПроблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.

Да, именно так работает TCP и именно это тебе твердят с самого начала. Но до тебя никак не
доходит. Видимо, твой мозг работает по UDP.


Да не разбивает он ничего, не дури голову парню...
И так плохо с этим.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711143
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb1. Смотрел, там сначала берется количество строк, затем они считываются.

Считываются... Во WriteStrings... Ага...

Ты, походу, совсем безнадёжен.

Sergey_rb2. Я писал, что использую протокол HTTP?
ДА. Прямо тут:
Sergey_rbискать два переноса строк подряд
Или ты не понимаешь даже то, что пишешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711145
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb
Для небольших сообщений, менее 2 Кб все прекрасно работает, т.к. это сообщения помещаются в один пакет.
Проблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.


Никто никуда ничего не разбивает.

ТЫ ЭТО ДЕЛАЕШЬ САМ!

Вот твой код:

Код: plaintext
1.
res = recv(sock, rbuff, sizeof(rbuff), 0);



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


Для небольших сообщений, менее 2 Кб все прекрасно работает, т.к. это сообщения помещаются в один пакет.
Проблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.
Ты хочешь проблему решить или доказать что она нерешаемая? Если первое - сделай то что я попросил сделать.

Запрос на сервер
автор0|CONNECT|

Получено с сервера
автор607|Подключено|
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, MasterZiv. На 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря же WriteString s ()/ReadString s ()
Осталось увидеть что там в реале идет и будет все понятно.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711150
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSergey_rbДля небольших сообщений, менее 2 Кб все прекрасно работает, т.к. это сообщения помещаются в один пакет.
Проблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты.


Никто никуда ничего не разбивает.

ТЫ ЭТО ДЕЛАЕШЬ САМ!

Вот твой код:

Код: plaintext
1.
res = recv(sock, rbuff, sizeof(rbuff), 0);



Прочитай про третий параметр функции recv .

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

Ты хочешь проблему решить или доказать что она нерешаемая? Если первое - сделай то что я попросил сделать.

Запрос на сервер
автор0|CONNECT|

Получено с сервера
автор607|Подключено|
Я это просил?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711152
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rb2. Я писал, что использую протокол HTTP?
ДА. Прямо тут:
Sergey_rbискать два переноса строк подряд
Или ты не понимаешь даже то, что пишешь?..


Дима, ну нет же, не писал он это.
А одной пустой строкой во многих протоколах можно данные отделять (POP3 например), в том числе, в своём собственном.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711153
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbMasterZivпропущено...



Никто никуда ничего не разбивает.

ТЫ ЭТО ДЕЛАЕШЬ САМ!

Вот твой код:

Код: plaintext
1.
res = recv(sock, rbuff, sizeof(rbuff), 0);



Прочитай про третий параметр функции recv .

Размер буфера 10*1024, данных приходит максимум 5*1024

Значит, они просто не посылаются в таком объёме (10k)
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711154
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDimitry Sibiryakov, MasterZiv. На 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря же WriteString s ()/ReadString s ()
Осталось увидеть что там в реале идет и будет все понятно.

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


Размер буфера 10*1024, данных приходит максимум 5*1024

Значит, они просто не посылаются в таком объёме (10k)

Данные могут приходит в любом объеме, начиная от одного символа.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711158
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbStrings в Делфи - это набор строк, что-то вроде вектора в C++Тайна третьей планеты- Человек - царь природы
- Только звери об этом не знают - они неграмотныеЭто я к тому, что поток байтов не в курсе про векторы, дельфи и кресты.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711159
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо
Код: plaintext
1.
2.
3.
4.
res = recv(sock, rbuff, sizeof(rbuff), 0);
FILE* f = fopen("result.bin", "wb+");
fwrite(rbuff, 1, res, f);
fclose(f);


затем result.bin выложить сюда
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711166
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima TDimitry Sibiryakov, MasterZiv. На 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря же WriteString s ()/ReadString s ()
Осталось увидеть что там в реале идет и будет все понятно.

Strings в Делфи - это набор строк, что-то вроде вектора в C++
Это пофиг. TCP - это поток байт, а какой логический смысл в этих байтах для TCP без разницы. Сделай прием короткого сообщения как я выше написал 21691688
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711168
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


Strings в Делфи - это набор строк, что-то вроде вектора в C++
Это пофиг. TCP - это поток байт, а какой логический смысл в этих байтах для TCP без разницы. Сделай прием короткого сообщения как я выше написал 21691688

Какой в С++ аналог ExtractFileDir(ParamStr(0))?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711169
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНа 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря
же WriteStrings()/ReadStrings()

В моей версии инди таких функций вообще нет. Точнее они есть, но только как приватные в
FTP компонентах и они отсылают TStrings.Text как есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711173
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему аффтар уже слился до тупого троллинга. Мастер, закрывай топик.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711175
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.
2|RB|PKG_TPRN|REPRINT_PACK_MVIDEO|151|10|125||
1|||ChangeDiagram|192|10|166||
1|||SetCompProp|456|1|225|MessageLabel=visible|
1|||SetCompProp|345|5|225|MessageLabel=|
1|||SetCompProp|457|10|225|Edit1=barcode|
8|RB|PKG_TERMINAL|CHECK_USER|349|12|225|Проверка пользователя  |
1|||_If|337|20|225|if user_id=0|
1|||ViewMessage|339|30|225||
1|||SetCompProp|344|35|225|ActionList.Enabled=0|
1|||_Else|343|40|225||
1|||SetCompProp|340|60|225|ActionList.Enabled=1|
1|||SetFocus|498|65|225|Edit3|
1|||GetActionList|356|70|225||
1|||GetStateRole|358|80|225||
1|||SetGlobalVar|347|95|225|USER_ID=BARCODE|
1|||ChangeState|513|100|225||
1|||_EndIf|338|120|225||
1|||SetGlobalVar|346|20|226|USER_ID=0|
1|||SetFormCaption|350|30|226||
1|||SetEditProp|375|40|226|Edit1|
1|||SetButtonProp|408|50|226|btnOK  |
1|||SetFocus|415|60|226|Edit1|
1|||SetCompProp|1504|80|226|Edit6.Unvisible|
1|||SetFormCaption|351|10|227||
1|||SetFormCaption|352|10|228|Введите номер паллеты|
1|||SetCompProp|395|20|228|Edit1.Visible=1|
1|||SetDateProp|401|30|228|DateBegin|
1|||SetDateToday|402|40|228|DateBegin.Today|
1|||SetDateProp|404|50|228|DateEnd|
1|||SetDateToday|405|60|228|DateEndToday|
1|||SetComboBoxProp|406|70|228|Список принтеров|
7|||v_reprint_mvideo|407|80|228|Список принтеров|
1|||SetCompProp|409|90|228|Edit1=''|
1|||SetFormCaption|353|10|229||
2|RB|PKG_TPRN|REPRINT_PACK_MVIDEO|354|10|230||
1|||SetFormCaption|441|10|231|Авторизирован|
1|||SetCompProp|389|20|231|Edit1.Visible=0|
1|||SetCompProp|438|30|231|Edit2.Visible=0|
1|||SetCompProp|440|40|231|Label1.Visible=0|
1|||SetCompProp|442|50|231|Label2.Visible=0|
1|||SetCompProp|443|60|231|btnOK.Visible=0|
1|||SetCompProp|439|70|231|Button2.Visible=0|
1|||SetCompProp|568|90|231|message label|
1|||SetCompProp|589|100|231|Label4.Unvisible|
1|||SetCompProp|590|110|231|Label5.Unvisible|
1|||SetCompProp|591|120|231|Edit4.Unvisible|
1|||SetCompProp|592|130|231|Edit5.Unvisible|
1|||SetCompProp|3023|150|231|Edit6.Visible=0|
1|||SetCompProp|3024|160|231|Edit7.Visible=0|
1|||SetCompProp|3025|170|231|Edit8.Visible=0|
1|||SetCompProp|3026|180|231|Edit9.Visible=0|
1|||SetCompProp|3027|190|231|ComboBox1.Visible=0|
1|||SetCompProp|3028|200|231|Label6.Unvisible|
1|||SetCompProp|3029|210|231|Label7.Unvisible|
1|||SetCompProp|3022|300|231|Edit3=Visible|
1|||SetFocus|501|310|231|Edit3|
2|RB|PKG_TPRN|REPRINT_DOC_MVIDEO|355|10|233||
1|||SetCompProp|387|5|246|MessageLabel=|
8|RB|PKG_TERMINAL|CHECK_USER|382|12|246|Проверка пользователя  |
1|||_If|376|20|246|if user_id=0|
1|||ViewMessage|378|30|246||
1|||_Else|383|40|246||
1|||SetCompProp|379|60|246|ActionList.Enabled=1|
1|||SetFocus|497|65|246|Edit3.Focused|
1|||GetActionList|380|70|246||
1|||GetStateRole|385|80|246||
1|||SetGlobalVar|3
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711176
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видно, что последняя строка выгружена не вся
Перевода строки тоже нет.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711181
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВидно, что последняя строка выгружена не вся
Перевода строки тоже нет.
Мдя ... :(

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

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

Это пофиг. TCP - это поток байт, а какой логический смысл в этих байтах для TCP без разницы. Сделай прием короткого сообщения как я выше написал 21691688

Какой в С++ аналог ExtractFileDir(ParamStr(0))?
Посмотри на параметры своей стартовой функци.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711206
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbВидно, что последняя строка выгружена не вся
Перевода строки тоже нет.
Мдя ... :(

Сложно это сделать 21691688 на маленьком сообщении? которое целиком приходит.

Завтра сделаю
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711214
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Завтра еще поищи исходник WriteStrings(). Если это правда 21691701 , то это функция из какой-то твоей внутренней либы. Возможно досталась тебе как часть наработок твоего предприятия. Найдешь - выкладывай сюда.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711233
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это стандартные функции INDY
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711253
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TНа 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря
же WriteStrings()/ReadStrings()

В моей версии инди таких функций вообще нет. Точнее они есть, но только как приватные в
FTP компонентах и они отсылают TStrings.Text как есть.

Судя по всему, у ТС 9-я версия, там это есть, да и в доках к лазарусу сказано, что у них 9-я.

WriteStrings
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TIdTCPConnection.WriteStrings(AValue: TStrings; const AWriteLinesCount: Boolean = False);
var
  i: Integer;
begin
  if AWriteLinesCount then begin
    WriteInteger(AValue.Count);
  end;
  for i := 0 to AValue.Count - 1 do begin
    WriteLn(AValue.Strings[i]);
  end;
end;


Т.е., в начале может передаваться число строк (а может и не передаваться), тут к ТС вопрос.
WriteInteger
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TIdTCPConnection.WriteInteger(AValue: Integer; const AConvert: Boolean = True);
begin
  if AConvert then begin
    AValue := Integer(GStack.WSHToNl(LongWord(AValue)));
  end;
  WriteBuffer(AValue, SizeOf(AValue));
end;



Writeln
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TIdTCPConnection.WriteLn(const AOut: string = '');
begin
  Write(AOut + EOL);
// Здесь:
//  LF = #10;
//  CR = #13;
//  EOL = CR + LF;
end;



Write
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TIdTCPConnection.Write(const AOut: string);
var
  LOutLen: Integer;
begin
  LOutLen := Length(AOut);
  if LOutLen > 0 then begin
    WriteBuffer(Pointer(AOut)^, LOutLen);
  end;
end; //Write



Ну и вот самое интересное: WriteBuffer().
WriteBuffer
Код: pascal
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.
procedure TIdTCPConnection.WriteBuffer(const ABuffer; AByteCount: Integer;
  const AWriteNow: boolean = false);
var
  LBuffer: TIdSimpleBuffer;
  nPos, nByteCount: Integer;
begin
  if (AByteCount > 0) and (@ABuffer <> nil) then begin
    // Check if disconnected
    CheckForDisconnect(True, True);
    if connected then begin
      if (FWriteBuffer = nil) or AWriteNow then begin
        LBuffer := TIdSimpleBuffer.Create; try
          LBuffer.WriteBuffer(ABuffer, AByteCount);
          if Assigned(Intercept) then begin
            LBuffer.Position := 0;
            Intercept.Send(LBuffer);
            AByteCount := LBuffer.Size;
          end;
          nPos := 1;
          repeat
            nByteCount := IOHandler.Send(PChar(LBuffer.Memory)[nPos - 1], LBuffer.Size - nPos + 1);
            FClosedGracefully := nByteCount = 0;
            // Check if other side disconnected
            CheckForDisconnect;
            // Check to see if the error signifies disconnection
            if GStack.CheckForSocketError(nByteCount, [ID_WSAESHUTDOWN, Id_WSAECONNABORTED, Id_WSAECONNRESET]) then begin
              DisconnectSocket;
              GStack.RaiseSocketError(GStack.LastError);
            end;
            // TODO - Have a AntiFreeze param which allows the send to be split up so that process
            // can be called more. Maybe a prop of the connection, MaxSendSize?
            TIdAntiFreezeBase.DoProcess(False);
            DoWork(wmWrite, nByteCount);
            nPos := nPos + nByteCount;
          until nPos > AByteCount;
        finally FreeAndNil(LBuffer); end;
      // Write Buffering is enabled
      end else begin
        FWriteBuffer.WriteBuffer(ABuffer, AByteCount);
        if (FWriteBuffer.Size >= FWriteBufferThreshhold) and (FWriteBufferThreshhold > 0) then begin
          // TODO: Maybe? instead of flushing - Write until buffer is smaller than Threshold.
          // That is do at least one physical send.
          FlushWriteBuffer(FWriteBufferThreshhold);
        end;
      end;
    end
    else
    begin
      raise EIdNotConnected.Create(RSNotConnected);
    end;
  end;
end;



...
Т.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711281
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня 9 версия INDY.

авторВ каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

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

Ей это и не надо. Это функция транспортного уровня, она принимает простой поток байт. До
протоколов уровня приложения ей дела нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711306
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbВот только функция recv эту длину почему-то не видит

Ей это и не надо. Это функция транспортного уровня, она принимает простой поток байт. До
протоколов уровня приложения ей дела нет.


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

Да. И это, внезапно, ReadStrings из INDY. Потому что протокол не зря называется "уровня
приложения".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711412
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияТ.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.
Осталось увидеть дамп принятого сообщения 21691688 и все станет понятно.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711423
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое сообщение

автор607|192.168.96.204|Подключено|


Заканчивается переводом строки 13 10
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711425
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|
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711427
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbТогда должна быть другая функция, которая работает на уровне протокола.

Да. И это, внезапно, ReadStrings из INDY. Потому что протокол не зря называется "уровня
приложения".


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

PS Дамп будет 21691688 ?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711440
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbНикто и не просит функцию recv выдавать форматированный текст, ее задача вытащить все данные из сокета, с которой она справляется, но не всегда...
recv() работает совсем не так как ты ожидаешь.

PS Дамп будет 21691688 ?

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

Предварительно, я посмотрел HEX этого файла
Он заканчивается двумя переводами строк
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711540
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия...
Т.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

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

авторВ каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

Вот только функция recv эту длину почему-то не видит, а выдает размер принятого пакета.

Мля, ПОТОМУ ЧТО ТЫ ЕГО ЗАДАЁШЬ НА ВХОДЕ recv!
ЗАДАВАЙ БОЛЬШЕ! ОНО БУДЕТ ТЕБЕ ВЫДАВАТЬ БОЛЬШЕ!
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711543
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb ...

И если мне кто-то ещё посмеет возразить, что Pascal, Delphi неисправимо калечат людям мозг, то я просто дам ссылку на этот топик...
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711563
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSergey_rbДа, у меня 9 версия INDY.

пропущено...


Вот только функция recv эту длину почему-то не видит, а выдает размер принятого пакета.

Мля, ПОТОМУ ЧТО ТЫ ЕГО ЗАДАЁШЬ НА ВХОДЕ recv!
ЗАДАВАЙ БОЛЬШЕ! ОНО БУДЕТ ТЕБЕ ВЫДАВАТЬ БОЛЬШЕ!

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

И если мне кто-то ещё посмеет возразить, что Pascal, Delphi неисправимо калечат людям мозг, то я просто дам ссылку на этот топик...

Что доказывает поговорку:

авторопытный программист С++ с легкостью может решить проблему, не существующую в Delphi
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711576
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И подтверждает, что опытный программист Дельфи не может решить проблему, возникающую в Дельфи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711580
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИ подтверждает, что опытный программист Дельфи не может решить проблему, возникающую в Дельфи.


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

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

Тогда зачем ты здесь пытаешься использовать recv() вместо ReadStrings() там?


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

Это либо не проблема, либо кто-то совсем не умеет в логику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711607
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rb у меня проблем в Дельфи не возникает.
Sergey_rbПотому что прога, написанная в Лазарусе, не работает под WinCe7.

Это либо не проблема, либо кто-то совсем не умеет в логику.


А вы в этом профи.

Только что-то никто из вас так и не написал функцию, получающую данные из сокета, не закрывая сокета.

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

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


И если мне кто-то ещё посмеет возразить, что Pascal, Delphi неисправимо калечат людям мозг, то я просто дам ссылку на этот топик...
Мне кажется, что ТС просто троллит.

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

пропущено...

Это либо не проблема, либо кто-то совсем не умеет в логику.


А вы в этом профи.

Только что-то никто из вас так и не написал функцию, получающую данные из сокета, не закрывая сокета.

Развели флуда на 5 страниц.
Что за бред?
Я тебе ссылку на описание примеров работы с tcp дал, что ты упираешься в свою indy? Если ты не знаешь формата формируемого тобой сообщения - ты гарантированно не сможешь его принять и обработать.
Увольняйся, меняй работу, нанимай программиста, разбирай сам - выбор большой, но само собой ничего не заработает, и вместо тебя никто делать точно не станет
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711624
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbпропущено...


А вы в этом профи.

Только что-то никто из вас так и не написал функцию, получающую данные из сокета, не закрывая сокета.

Развели флуда на 5 страниц.
Что за бред?
Я тебе ссылку на описание примеров работы с tcp дал, что ты упираешься в свою indy? Если ты не знаешь формата формируемого тобой сообщения - ты гарантированно не сможешь его принять и обработать.
Увольняйся, меняй работу, нанимай программиста, разбирай сам - выбор большой, но само собой ничего не заработает, и вместо тебя никто делать точно не станет

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

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

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

За последние полгода я этих функций написал не менее полудюжины. Большая часть была
push-типа, скармливающая принятый кусок конечному автомату, меньшая - pull-типа, читающая
из сокета столько байт сколько от неё хотела вышестоящая процедура. И они все работают
так, как этого требует логика моего приложения и структура моего протокола передачи. Но
что (и зачем) писать для тебя, когда и логика и протокол неизвестны даже тебе самому?

В этом топике уже все ответы отвечены, все советы посоветованы. Если ты не в состоянии их
понять - это проблема не топика. Голосую: пристрелить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711637
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про протокол я тоже писал - это набор строк, заканчивающиеся переводом строки.

Несколько байт я тоже могу и отправить и принять.
Вопрос в получении более большого объема строк, который разбивается на порции (раз от слова пакет всех почему-то воротит)

Все предложенные решения были основаны на проверку закрытии сокета.
Меня это решение не устраивает.

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

Ок, правильно решение, практически копи-паст из работающей программы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
while (true)
{
   char buffer[1000]
   int r = recv(s, buffer, sizeof(buffer), 0);
   if (r > 0)
     parser->EatThis(buffer, r);
   else
   {
     if (r < 0)
       fprintf(stderr, "recv() error %d\n", WSAGetLastError());
     break;
   }
}


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

Код: plaintext
1.
 if (r < 0)



При закрытии сокета?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711643
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том, который описан в документации по recv(), которую надо читать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711644
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

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

что ты уперся в это закрытие сокета? Из сокета читают по мере надобности, а закрыаается он при дисконнекте (например).

Потому что неизвестно, на сколько кусков будет разбито входящее сообщение.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711649
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDimitry Sibiryakovпропущено...

Тогда зачем ты здесь пытаешься использовать recv() вместо ReadStrings() там?


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


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

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

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

Прототип:

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

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

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


Потому что прога, написанная в Лазарусе, не работает под WinCe7.Indy в исходниках же идет. Берешь и переводишь построчно с паскаля на С ReadStrings и все остальные функции, от которых она зависит.

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


Потому что прога, написанная в Лазарусе, не работает под WinCe7.Indy в исходниках же идет. Берешь и переводишь построчно с паскаля на С ReadStrings и все остальные функции, от которых она зависит.
Инди и для си-шарпа вроде как есть, можно попробовать привычные для ТС формочки по-быстрому нашлепать для WinEC 7.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711659
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb...
Recv не понимает этого протокола, и, возвращает только количество байт, в полученном куске данных.
Хлопчык, ты книжку - чытав?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711660
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЧитаем описание

Не, ты описание процитировал. А надо читать. Чтобы не задавать глупых вопросов "в каком
случае возвращается значение меньше нуля".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711662
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbBarloneпропущено...
Indy в исходниках же идет. Берешь и переводишь построчно с паскаля на С ReadStrings и все остальные функции, от которых она зависит.

ReadStrings сначала получает количество строк, потом последовательно их считывает.
Recv не понимает этого протокола, и, возвращает только количество байт, в полученном куске данных.Да, не понимает. Поэтому и надо написать свой аналог ReadStrings. На самом деле, ReadStrings вызывает recv глубоко внутри, в ReadFromStack - IOHandler.Recv это тот самый системный recv (ну почти, небольшой враппер над ним). И recv вызывается внутри ReadStrings гораздо больше одного раза.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711667
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneSergey_rbпропущено...


ReadStrings сначала получает количество строк, потом последовательно их считывает.
Recv не понимает этого протокола, и, возвращает только количество байт, в полученном куске данных.Да, не понимает. Поэтому и надо написать свой аналог ReadStrings. На самом деле, ReadStrings вызывает recv глубоко внутри, в ReadFromStack - IOHandler.Recv это тот самый системный recv (ну почти, небольшой враппер над ним). И recv вызывается внутри ReadStrings гораздо больше одного раза.

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

Не, ты описание процитировал. А надо читать. Чтобы не задавать глупых вопросов "в каком
случае возвращается значение меньше нуля".


авторReturn Value

If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.



Error code

Meaning

WSANOTINITIALISED A successful WSAStartup call must occur before using this function.
WSAENETDOWN The network subsystem has failed.
WSAEFAULT The buf parameter is not completely contained in a valid part of the user address space.
WSAENOTCONN The socket is not connected.
WSAEINTR The (blocking) call was canceled through WSACancelBlockingCall.
WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAENETRESET For a connection-oriented socket, this error indicates that the connection has been broken due to keep-alive activity that detected a failure while the operation was in progress. For a datagram socket, this error indicates that the time to live has expired.
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
WSAESHUTDOWN The socket has been shut down; it is not possible to receive on a socket after shutdown has been invoked with how set to SD_RECEIVE or SD_BOTH.
WSAEWOULDBLOCK The socket is marked as nonblocking and the receive operation would block.
WSAEMSGSIZE The message was too large to fit into the specified buffer and was truncated.
WSAEINVAL The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled or (for byte stream sockets only) len was zero or negative.
WSAECONNABORTED The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no longer usable.
WSAETIMEDOUT The connection has been dropped because of a network failure or because the peer system failed to respond.
WSAECONNRESET The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket as it is no longer usable. On a UDP-datagram socket, this error would indicate that a previous send operation resulted in an ICMP "Port Unreachable" message.


Все они связаны с возникновением ошибок, а не с завершением приема данных
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711670
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbBarloneпропущено...
Да, не понимает. Поэтому и надо написать свой аналог ReadStrings. На самом деле, ReadStrings вызывает recv глубоко внутри, в ReadFromStack - IOHandler.Recv это тот самый системный recv (ну почти, небольшой враппер над ним). И recv вызывается внутри ReadStrings гораздо больше одного раза.

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

И это правильно, потому что завершение приёма данных сигнализируется возвращаемым
значением, бОльшим нуля. БОЛЬШИМ!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711675
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbBarloneпропущено...
Да, не понимает. Поэтому и надо написать свой аналог ReadStrings. На самом деле, ReadStrings вызывает recv глубоко внутри, в ReadFromStack - IOHandler.Recv это тот самый системный recv (ну почти, небольшой враппер над ним). И recv вызывается внутри ReadStrings гораздо больше одного раза.

Я уже понял, что аналог ReadStrings мне не написать.
Сделал новый сервер, который отправляет ответы через WriteLn.О как. И каким образом это решает проблему с определением длины?
На самом деле, совсем не обязательно ReadStrings переводить буквально построчно. Надо просто достать из первых четырех байт полученного буфера количество строк. И читать дальше, считая переводы строк.
...
Рейтинг: 0 / 0
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
recv выход из цикла
    #39712147
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv...
Это ты плохое описание нашёл. Там не только -1 возвращается, но и другие отрицательные величины тоже.
Ну он после еще нашел: 21692641
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712148
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor BarchenkoSergey_rb,

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

Отвечая на твой вопрос в первом сообщении ветки:
чтобы организовать неблокирующее чтение в цикле из сокета надо почитать про функцию select, позволяющую организовать мониторинг нескольких сокетов по разным событиям - включая объем готовых для чтения байт в буфере, тогда recv не завершиться блокировкой. Дальше складирование прочитанного в буфер и анализ его - полное сообщение(строка, фикс длина, маркеры - это уж как протокол устроен) пришло или нет. И дальше ожидание проверка необходимости выхода из цикла, или разбор событий винды или что там еще тебе нужно в не заблокированном цикле, например выход из него.

Ну и что, всё равно ему придётся складывать последовательные прочитанные куски в одно большое целое и частями обрабатывать.
ВНУТРИ ЦИКЛА ВЫБОРКИ.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39712149
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, похоже, более ничего конструктивного не получится.
...
Рейтинг: 0 / 0
178 сообщений из 178, показаны все 8 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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