![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
передача строки через Indy UDP
uniken1 © (2011-01-27 15:50:00)Delphi 2010!
Код на стороне клиента:
procedure TForm1.Button2Click(Sender: TObject);
var s:string;
begin
s:='Test Message';
IdUDPClient1.Send(Edit1.Text,9999,s);;
end;
Код на стороне сервера:
procedure TForm1.UDPServerUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
var i:integer;
begin
for I := 0 to length(AData) - 1 do
Caption:=Caption+chr(AData[i]);
end;
Этот код работает, но почему отправляемая строка в юникоде (на сколько я понял в 2010 тип string это юникод), а принимаемая в анси? Это я что-то не так настроил или это особенность работы Indy?
uniken1 (2011-01-29 08:11:00) [1]Хм, раньше здесь помогали...
Хорошо хоть официальном сайте объяснили все нормально
http://forums2.atozed.com/viewtopic.php?f=7&t=18617&p=22110#p22110
uniken1 (2011-01-28 13:07:00) [2]
> ух ты..
>
> а точно?
>
> это не работает?
>
> procedure TForm1.btn1Click(Sender: TObject);
> begin
> idpclnt1.Send('127.0.0.1',5555,'Ёкарный бабай');
> end;
>
> procedure TForm1.idpsrvr1UDPRead(Sender: TObject; AData:
> TStream; ABinding: TIdSocketHandle);
> begin
> mmo1.Lines.LoadFromStream(AData);
> end;
Этот код работал до 2010. В 2010 сам метод имеем другие параметры:
UDPServerUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
Сергей М. (2011-01-28 13:02:00) [3]
> RWolf © (28.01.11 12:44) [8]
http://www.indyproject.org/Sockets/Bugs.en.aspx
Самое улыбнутое там: "Тупые юзеры затрахали систему публичных баг-репортов своими дурацкими и непродуманными вопросами, поэтому отныне пусть в поисках правды парятся на разного пошиба форумах"
RWolf (2011-01-28 12:44:00) [4]
> Сергей М. © (28.01.11 12:13) [6]
а вот где бы ознакомиться с граблями Indy, хотя бы частично?
а то у меня через неё в одной программе HTTP-контент раздаётся интенсивно, хотелось бы заранее ознакомиться, чтобы неожиданно по лбу не ударило.
12 (2011-01-28 12:27:00) [5]ух ты..
а точно?
это не работает?
procedure TForm1.btn1Click(Sender: TObject);
begin
idpclnt1.Send('127.0.0.1',5555,'Ёкарный бабай');
end;
procedure TForm1.idpsrvr1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
begin
mmo1.Lines.LoadFromStream(AData);
end;
Сергей М. (2011-01-28 12:13:00) [6]> в send передается юникодная строка
А в потрохах Send'а она поди конвертируется в Ansi
Или уже на принимающей стороне принятая юникодовая строка конвертится в ansi до того как попасть через TBytes в твой обработчик.
Вот и все чудеса)
А чудес в Инди и без этого хватает, так что наблюдаемое тобой "чудо" - это еще невинная индейская шалость по сравнению с другими грабельками, граблями и граблищами.
uniken1 (2011-01-28 11:59:00) [7]Может я что-то не так объясняю?
На выходе строка юникод: 12 символов ( 24 байта)
На входе массив : 12 байт которые преобразуются в 12 символов с!!
внутри массива ansi строка, которую я вывожу в заголовок формы с помощью функции chr, ну я уже не знаю как еще объяснить что в send передается юникодная строка в Read принимается ansi строка.
Anatoly Podgoretsky (2011-01-28 11:28:00) [8]Я отлично знаю, что это функция.
Тогда зачем ты это делаешь Caption:=Caption+chr(AData[i]);
Byte не имеет отношения к Юникод!!!
uniken1 (2011-01-28 10:58:00) [9]UDPClient отправляет в процедуре Send строку, в D2010 она юникод.
UDPServer получает эту строку в массив AData.
chr -это стандартная функия(существует еще с паскаля) преобразования byte в char. Это не тип!
Anatoly Podgoretsky (2011-01-28 09:54:00) [10]Что за тип такой chr
12 (2011-01-28 09:43:00) [11]отправляется string, юникод
а принимается как chr(
http://www.webdelphi.ru/2009/10/delphi-2010-rabota-s-klaviaturoj-v-usloviyax-unicode/
не то?