Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.04.2011, 18:46
sunnmas sunnmas вне форума
Прохожий
 
Регистрация: 12.04.2011
Сообщения: 1
Репутация: 10
По умолчанию Прием данных в поток 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter