Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Вниз

чтение сокета. ServerSocket1ClientRead   Найти похожие ветки 

 
Цукор5   (2010-06-14 23:46) [0]

Отсылаю некоторую структуру по сети, используя компонент TClientSocket и принимаю ее же компонентом TServerSocket.
Предположим, так :

type
 TIndMsg = packed record
   Start : Byte;
   Mode  : Byte;
   Addr  : Byte;
   Value : Word;
   Stop  : Byte;
 end;
 PIndMsg = ^TIndMsg;

procedure TForm1.Button1Click(Sender: TObject);
 var Ind:TIndMsg;
begin
 Ind.Start := $0A;
 Ind.Mode  := RandomRange(1,10);
 Ind.Addr  := $05;
 Ind.Value := $01;
 Ind.Stop  := $0D;
 ClientSocket1.Socket.SendBuf(Ind,SizeOf(TIndMsg));
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
 var N:Integer;
 Ind:TIndMsg;
begin
 N:=Socket.ReceiveLength;
 if N>=SizeOf(TIndMsg) then
 begin
   Socket.ReceiveBuf(Ind,SizeOf(TIndMsg));
   //Memo1.Lines.Add(IntToStr( Ind.Value )); смотрю что пришло
 end;
end;


Все хорошо. Все работает. Но!!!Используемый мною режим stNonBlocking. Я правильно понимаю, что НЕТ никаких гарантий, что пакет прийдет именно моего размера?
Он может прийти как угодно.
Например так:
-0A 02
-05 00 01 0D
или так (сразу придет 2 пакета)
-0A 02 05 00 01 0D 0A 07 05 00 01 0D

И лучше, например, принимать по-байтно. Далее контролировать условия пакета и если оно выполнено, то только тогда наполнять структуру TIndMsg.
Я верно рассуждаю?

Заранее спасибо!


 
KilkennyCat ©   (2010-06-15 00:44) [1]


> Используемый мною режим stNonBlocking. Я правильно понимаю,
>  что НЕТ никаких гарантий, что пакет прийдет именно моего
> размера?


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


 
Цукор5   (2010-06-15 00:57) [2]

2 KilkennyCat ©   (15.06.10 00:44) [1]
Хм...странно. Вот нашел на Королевстве: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=51444

Цитата А.Григорьева : Протокол TCP допускает склеивание пакетов в один, т.е. то, что вы отправляли за несколько Send"ов, может быть получено одним Receive"ом


 
Германн ©   (2010-06-15 01:03) [3]


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

Хм. А ты уверен? Асинхронная работа при приёме/передаче не может не "дробить" на куски длинный блок данных, имхо.


 
Германн ©   (2010-06-15 01:06) [4]


> Цукор5   (15.06.10 00:57) [2]

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


 
Цукор5   (2010-06-15 01:13) [5]

2 Германн ©   (15.06.10 01:06) [4]

Ок. Спасибо.


 
KilkennyCat ©   (2010-06-15 01:16) [6]


> Асинхронная работа при приёме/передаче не может не "дробить"
> на куски длинный блок данных, имхо.

да пофиг. есть начало данных, есть конец данных, а какой кучей они пришли - неважно.


 
Германн ©   (2010-06-15 02:45) [7]


> Цукор5   (14.06.10 23:46)

Хм. Интересный выбор признаков начала и конца блока посылки.
Ну тут уж АП - мастер.


 
Сергей М. ©   (2010-06-15 10:11) [8]


> Я правильно понимаю, что НЕТ никаких гарантий, что пакет
> прийдет именно моего размера?


Да, правильно.
Но non-blocking-режим здесь совершенно ни причем.


 
Вариант   (2010-06-15 10:39) [9]


> Германн ©   (15.06.10 01:06) [4]


Режим работы  сокета асинхронный или не асинхронный,значения не имеет для фрагментации пакета, так же как и для склеивания нескольких пакетов один.


 
balepa   (2010-06-15 13:47) [10]

CRC можно добавить.


 
KilkennyCat ©   (2010-06-15 17:52) [11]

зачем?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1273957893
NailMan
2010-05-16 01:11
2010.09.12
Свершилось чудо Маниту


15-1276600467
Правильный$Вася
2010-06-15 15:14
2010.09.12
странный образ диска


2-1276848535
LDV
2010-06-18 12:08
2010.09.12
проверка существования поля в таблицах


4-1220443358
dmitry_12_08_74
2008-09-03 16:02
2010.09.12
как получить handle текущего активного окна на рабочем столе


2-1276295129
HRustBB
2010-06-12 02:25
2010.09.12
как получить указатель на экземпляр класса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский