-
Что имеется:
1. Контроллер (PLC) c Ethernet его IP=192.168.0.20 (порт для подключения 102);
2. Компьютер (PC) мой IP=192.168.0.12
Что требуется:
1. Подключиться к порту
2. Периодически отсылать посылки байтов
Что делаю:
1. На форму ClientSocket поставил параметры:
Address: 192.168.0.20
ClientType: ctNonBlocking
Port: 102
2. На кнопку отсылаю ClientSocket1.Socket.SendText(#00);
3. Жду событие onRead
Что не получается:
1. Не происходит события onRead...
2. Через несколько посылок Disconnect...
Аргумент:
смотрю пакеты CommView`ом, пакеты видны...
-
VFaust © (26.10.10 10:46)Новичку проще в Blocking режиме...
procedure TForm1.Button1Click(Sender: TObject);
var
CSock:TClientSocket;
CStream:TWinSocketStream;
Buf:array[byte] of char;
Readed:integer;
begin
CSock:=TClientSocket.Create(nil);
try
CSock.ClientType:=ctBlocking;
CSock.Address:='192.168.0.20';
CSock.Port:=102;
CSock.Active:=true;
CStream:=TWinSocketStream.Create(CSock.Socket,10000);
try
while CSock.Active do
begin
CSock.Socket.SendText(#00);
if not CStream.WaitForData(CStream.TimeOut) then Break;
Readed:=CStream.Read(Buf,SizeOf(Buf));
end;
finally
CStream.Free;
end;
finally
CSock.Free;
end;
end;
-
> Slym © (26.10.10 12:28)
>
> Новичку проще в Blocking режиме...
>
Пробовал..., приложение ждет некоторое время..., но посылки не видит..
смотрю пакеты CommView`ом, пакеты видны...
передавал: #00
должен принять: #00 #00 #00 #00 #00 #00
P.S. пробовал делать мини-Чат, всё работает...
P.P.S. делал анологичное приложение, всё работает, но там был другой порт и PLC...
может все дело в адресе порта?
-
> VFaust © (26.10.10 13:52) [2]
зачем слать как текст то, что не является текстом.
-
А зачем мне тест отсылать как массив байтов, если я массив могу отослать как строку...
P.S. Суть дело не меняет...
-
> Пробовал..., приложение ждет некоторое время..., но посылки
> не видит..
> смотрю пакеты CommView`ом, пакеты видны...
Не может быть. Если чтото их видит, а приложение их не recv'ит это хрень полная...
в моем коде чему равно Readed?
-
> VFaust
Я надеюсь ты не настолько бестолков чтобы вызывать SendЧегоТоТам раньше факта возбуждения OnWrite или хотя бы OnConnect ?
Только не говори "а зачем" - зачморим и отправим в "Начинающие")
-
Жму button1, включаем ClientSocket1.Active := true;
Появляется событие onConnect
Появляется событие onWrite
Жму button2, посылаем ClientSocket1.Socket.SendText(#00);
(вижу пакет передан через CommView)
(почти тут же вижу ответный пакет через CommView)
но событие onRead не выполняется
после дальнейших нажиманий на button2 (всего 4 раза)
Появляется событие DisConnect
-
> Slym © (26.10.10 19:49) [5]
>
>
> > Пробовал..., приложение ждет некоторое время..., но посылки
> > не видит..
> > смотрю пакеты CommView`ом, пакеты видны...
>
> Не может быть. Если чтото их видит, а приложение их не
> recv'ит это хрень полная...
> в моем коде чему равно Readed?
Я вас прекрасно понимаю..., но чего нет, того нет...
Пробовал на другом компе запускать..., безрезультатно...
Выключал все firewall`ы, касперских..., безрезультатно...
-
если обработчик онрид не получает управление, значит он не назначен соответствующему свойству-событию
иного объяснения этому "феномену" я не вижу
-
> Сергей М. © (26.10.10 22:15) [9]
>
> если обработчик онрид не получает управление, значит он
> не назначен соответствующему свойству-событию
Это чья проблема моей криворукости или Delphi...?
-
> VFaust © (26.10.10 22:26) [10]
У меня пока нет повода пенять на Delphi)
-
> У меня пока нет повода пенять на Delphi)
:D
Только что заметил маленький нюанс...
При расшифровке пакета ComView в пакете подсвечивает части [Ethernet II], [IP], [TCP]...
После области TCP я наблюдаю свои данные...!!!!, но в расшифровке эти данные не значатся..., а параметр TCP.Data length = 0...!!!
-
Покопал еще...,
во всех исходящих пакетах
IP -> Flags -> Don't fragment bit: 1 - Don't fragment
а во входящих пакетах
IP -> Flags -> Don't fragment bit: 0 - May fragment
-
> P.S. Суть дело не меняет...
а что мы знаем о строках? pchar например. и есть ли в виндовс дельфийские string...
p.s. очень даже меняет.
-
> а параметр TCP.Data length = 0...!!!
логично черт побери, если ты как текст посылаешь то, что здесь показываешь.
-
-
ну если PSH не взведен во входящем пакете, то неудивительно что 5 вошедших байт висят в буфере приема и не отдаются приложению
попробуй сразу после коннекта отключить буферизацию вх.потока установкой в ноль опции SO_RCVBUF клиентского гнезда
-
> отключить буферизацию вх.потока установкой в ноль опции
> SO_RCVBUF клиентского гнезда
Я то понимаю что от меня требуется, но закодить такое сразу немогу :(...
Курю интернет и ООП...
-
> Проблема не в отправлении, а в приеме...
т.е. то что при формировании пакета на оправлении компоненты ставят длину данных = 0 (что совершенно правильно с точки зрения строк), пофиг? а вот то, что при приеме они читают 0 байт это уже считается проблемой... причем не связанная с причиной.
шутить изволите?