|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Прием данных в поток Indy10
Имею Delphi 10Lite
Имеется платка, которая подсоединяется к компу по усб, эмулируя ком порт. Работать с ней умею. есть офис с несколькими компами, объединенных в локалку. Есть приложение, которое может использоваться с данной платкой. Сейчас если кто-то хочет поработать должен брать плату и подсоединять к своему компу. Так она кочует с компа на комп. Нужно сделать так, чтобы она была подключена к какому либо компу. На этом компе запущен сервер, к которому будут подключаться другие через tcp и работать с железом. сделал на Indy10 Вот рабочий кусок кода (он в сокращении выложен. оставлены только ключевые моменты): клиент: Код:
TcpCli:=TIdTCPClient.Create(nil); TcpCli.Port:=3006; TCPCli.ReadTimeout:=1000; TCPCli.UseNagle:=false; ... TCPCli.Host:=NOD; TcpCli.Connect; if not TcpCli.Connected then begin LOG.WriteString(' TcpCli not connected to server'+#13#10); exit; end; ... try TCPCli.IOHandler.WriteBufferOpen; TCPCli.IOHandler.Write(FWrBuf); -шлю 1 байт TCPCli.IOHandler.WriteBufferClose; except on E: EIdException do begin LOG.WriteString('WriteBuffer failed. exception: '+E.Message+#13#10); Result:=false; end else begin LOG.WriteString('WriteBuffer failed. Fuck, Shit!'+#13#10); Result:=false; end; end; сервер Код:
procedure TMainForm.IdTCPServerExecute(AConte xt: TIdContext); var buf: array[0..100] of byte; begin try with AContext.Connection do begin try Dongle.FWrBuf.Clear; try IOHandler.ReadStream(Dongle.FWrBuf,1); принимаю 1 байт except end; if Dongle.FWrBuf.Size>0 then begin //пишем данные в плату if not Dongle.WriteBuffer then exit; end; //читаем данные из платы Dongle.FRdBuf.Clear; Dongle.ReadBuffer; if Dongle.FRdBuf.Size>0 then begin //отправляем ответ от платы клиентской программе IOHandler.WriteBufferOpen; IOHandler.Write(Dongle.FRdBuf); IOHandler.WriteBufferClose; exit; end; except end; end; finally end; end; Вот так все работает Но нужно двигаться дальше. Отсылать серваку не 1 байт, а произвольное их количество Для этого на сервере изменяю так: Код:
with AContext.Connection do begin try Dongle.FWrBuf.Clear; IOHandler.ReadTimeout(50); try IOHandler.ReadStream(Dongle.FWrBuf); except end; ставлю на сервере usenagle=false при этом IOHandler.ReadStream не зависает, но и не принимает никаких данных (от клиента все так же шлю пока 1 байт) Кстати при использовании TIdLOGFile у клиента: Sent 12.04.2011 0:24:31: у сервера: Recv 12.04.2011 0:24:31: там после двоеточия идет квадратик(типо неотображаемый символ я полагаю) По сему на сервер данные поступают, но в поток Dongle.FWrBuf этот байт не записывается! как быть? Последний раз редактировалось Admin, 12.04.2011 в 18:50. |