Конференция "Сети" » ClientSocket нет события onRead [D7, WinXP]
 
  • VFaust © (26.10.10 10:46) [0]
    Что имеется:
    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`ом, пакеты видны...
  • Slym © (26.10.10 12:28) [1]
    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;

  • VFaust © (26.10.10 13:52) [2]

    > Slym ©   (26.10.10 12:28)
    >
    > Новичку проще в Blocking режиме...
    >

    Пробовал..., приложение ждет некоторое время..., но посылки не видит..
    смотрю пакеты CommView`ом, пакеты видны...

    передавал: #00
    должен принять: #00 #00 #00 #00 #00 #00

    P.S. пробовал делать мини-Чат, всё работает...
    P.P.S. делал анологичное приложение, всё работает, но там был другой порт и PLC...

    может все дело в адресе порта?
  • DVM © (26.10.10 17:39) [3]

    > VFaust ©   (26.10.10 13:52) [2]

    зачем слать как текст то, что не является текстом.
  • VFaust © (26.10.10 19:35) [4]
    А зачем мне тест отсылать как массив байтов, если я массив могу отослать как строку...
    P.S. Суть дело не меняет...
  • Slym © (26.10.10 19:49) [5]

    > Пробовал..., приложение ждет некоторое время..., но посылки
    > не видит..
    > смотрю пакеты CommView`ом, пакеты видны...

    Не может быть. Если чтото их видит, а приложение  их не recv'ит это хрень полная...
    в моем коде чему равно Readed?
  • Сергей М. © (26.10.10 20:44) [6]

    > VFaust


    Я надеюсь ты не настолько бестолков чтобы вызывать SendЧегоТоТам раньше факта возбуждения OnWrite или хотя бы OnConnect ?

    Только не говори "а зачем" - зачморим и отправим в "Начинающие")
  • VFaust © (26.10.10 22:01) [7]
    Жму button1, включаем ClientSocket1.Active := true;
    Появляется событие onConnect
    Появляется событие onWrite
    Жму button2, посылаем ClientSocket1.Socket.SendText(#00);
    (вижу пакет передан через CommView)
    (почти тут же вижу ответный пакет через CommView)
    но событие onRead не выполняется
    после дальнейших нажиманий на button2 (всего 4 раза)
    Появляется событие DisConnect
  • VFaust © (26.10.10 22:10) [8]

    > Slym ©   (26.10.10 19:49) [5]
    >
    >
    > > Пробовал..., приложение ждет некоторое время..., но посылки
    > > не видит..
    > > смотрю пакеты CommView`ом, пакеты видны...
    >
    > Не может быть. Если чтото их видит, а приложение  их не
    > recv'ит это хрень полная...
    > в моем коде чему равно Readed?


    Я вас прекрасно понимаю..., но чего нет, того нет...
    Пробовал на другом компе запускать..., безрезультатно...
    Выключал все firewall`ы, касперских..., безрезультатно...
  • Сергей М. © (26.10.10 22:15) [9]
    если обработчик онрид не получает управление, значит он не назначен соответствующему свойству-событию

    иного объяснения этому "феномену" я не вижу
  • VFaust © (26.10.10 22:26) [10]

    > Сергей М. ©   (26.10.10 22:15) [9]
    >
    > если обработчик онрид не получает управление, значит он
    > не назначен соответствующему свойству-событию

    Это чья проблема моей криворукости или Delphi...?
  • Сергей М. © (26.10.10 22:39) [11]

    > VFaust ©   (26.10.10 22:26) [10]


    У меня пока нет повода пенять на Delphi)
  • VFaust © (26.10.10 23:12) [12]

    > У меня пока нет повода пенять на Delphi)

    :D
    Только что заметил маленький нюанс...
    При расшифровке пакета ComView в пакете подсвечивает части [Ethernet II], [IP], [TCP]...
    После области TCP я наблюдаю свои данные...!!!!, но в расшифровке эти данные не значатся..., а параметр TCP.Data length = 0...!!!
  • VFaust © (26.10.10 23:43) [13]
    Покопал еще...,

    во всех исходящих пакетах
    IP -> Flags -> Don't fragment bit: 1 - Don't fragment

    а во входящих пакетах
    IP -> Flags -> Don't fragment bit: 0 - May fragment
  • sniknik © (27.10.10 00:27) [14]
    > P.S. Суть дело не меняет...
    а что мы знаем о строках? pchar например. и есть ли в виндовс дельфийские string...

    p.s. очень даже меняет.
  • sniknik © (27.10.10 00:30) [15]
    > а параметр TCP.Data length = 0...!!!
    логично черт побери, если ты как текст посылаешь то, что здесь показываешь.
  • VFaust © (27.10.10 11:54) [16]
    Проблема не в отправлении, а в приеме...

    Фото пакета который я отсылаю
    [IMG]http://www.imghost.in/images/65xjap5vez0amb51zvhr.gif[/IMG]

    Фото пакета, который я не могу получить
    [IMG]http://www.imghost.in/images/veicziy6uu3fbgssl54y.gif[/IMG]

    Красным выделены различия, как мне кажется из-за которых я не вижу пакета...
    Зеленым выделены данные...
  • Сергей М. © (27.10.10 12:24) [17]
    ну если PSH не взведен во входящем пакете, то неудивительно что 5 вошедших байт висят в буфере приема и не отдаются приложению

    попробуй сразу после коннекта отключить буферизацию вх.потока установкой в ноль опции SO_RCVBUF клиентского гнезда
  • VFaust © (27.10.10 14:18) [18]

    > отключить буферизацию вх.потока установкой в ноль опции
    > SO_RCVBUF клиентского гнезда

    Я то понимаю что от меня требуется, но закодить такое сразу немогу :(...
    Курю интернет и ООП...
  • sniknik © (27.10.10 15:59) [19]
    > Проблема не в отправлении, а в приеме...
    т.е. то что при формировании пакета на оправлении компоненты ставят длину данных = 0 (что совершенно правильно с точки зрения строк), пофиг? а вот то, что при приеме они читают 0 байт это уже считается проблемой... причем не связанная с причиной.

    шутить изволите?
 
Конференция "Сети" » ClientSocket нет события onRead [D7, WinXP]
Есть новые Нет новых   [134436   +24][b:0.001][p:0.002]