Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2013.05.05;
Скачать: [xml.tar.bz2];

Вниз

TServerSocket.ReceiveText в Delphi 2009 возвращает ????????...    Найти похожие ветки 

 
d@vinchi ©   (2009-09-09 19:01) [0]

В delphi 2009 тип строк по умолчанию юникоидный, но попытки привести полученную строку от TServerSocket.ReceiveText к нормальному виду пока никчекму не привели...
Кто сталкивался с этой траблой - как решить?


 
Сергей М. ©   (2009-09-10 08:24) [1]

"Трабла" в том, что передатчик посылает отнюдь не юникод.
Бессмысленно трактовать юникодом то что им на самом деле не является.


 
d@vinchi ©   (2009-09-10 11:48) [2]

так как правильно принять?


 
Сергей М. ©   (2009-09-10 12:50) [3]

ReceiveBuf


 
Anatoly Podgoretsky ©   (2009-09-10 13:13) [4]

Кстати а как пробовал, где код?


 
d@vinchi ©   (2009-09-10 15:05) [5]

из всех вариантов наиболее приближенный к ожидаемому результату так:

var
 sReceiveText: String;
...
 sReceiveText:=PAnsiChar(Socket.ReceiveText);
...

хотя предпологаю что так не совсем правильно и вместо пустых строк символ "s", чего явно не должно быть... Иногда при таком варианте в sReceiveText присутствуют куски "мусора". По сути вызов Socket.ReceiveText и так реализован через ReceiveBuf, вот его реализация:

function TCustomWinSocket.ReceiveText: string;
begin
 SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
 SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;

никак не доганю что не так?


 
Сергей М. ©   (2009-09-10 15:15) [6]


> чего явно не должно быть


Начнем с того - а что на самом деле должно быть ?
Что конкретно ты ожидал увидеть в строке sReceiveText ?
И какими средствами ты разглядывал содержимое этой строки - под отладчиком или каким-нить ShowMessage() ?


 
d@vinchi ©   (2009-09-10 15:41) [7]

1. Проект скомпелированный на Delphi 2007 работает как надо, т.е. в sReceiveText получаю строку в нормальном виде ожидаемого формата, на Delphi 2009 эта строка приходет в виде ???????????<вагон всякого мусора>
2. Конкретно то что мне отправляют если я Вас правильно понял, а отправляют мне строгоотформатированное текстовое сообщение (SIP протокол).
3. рассматривал под отладчиком...


 
Anatoly Podgoretsky ©   (2009-09-10 15:50) [8]


> никак не доганю что не так?

Должно быть function TCustomWinSocket.ReceiveText: AnsiString;


 
Сергей М. ©   (2009-09-10 15:50) [9]


> 3. рассматривал под отладчиком


Отладчик не показывает "вопросов", если ты им правильно пользуешься.
Покажи hex-дамп строки..


 
Anatoly Podgoretsky ©   (2009-09-10 15:55) [10]

Можно написать так

> function TCustomWinSocket.AnsiReceiveText: AnsiString;
> begin
>    SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
>    SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
>
> end;

Поскольку кроме ошибки с типом, также еще и SetLenght неверен, итого в функии правильны только две строки, это BEGIN и END
и таких мест множество, практически в каждой сетевой функции, если используются строки. Эта же проблема и с рядом DB библиотек, точно также безответсвенно подошли и там. Хотя проводили очень долгую компанию по переводу проектов пользователей под Юникод, а сами такого натворили.


 
d@vinchi ©   (2009-09-10 15:59) [11]


> function TCustomWinSocket.ReceiveText: AnsiString

так вот у меня
function TCustomWinSocket.ReceiveText: String
на сколько я понял это разработчики так спешили перейти на юникод что накосячили в TCustomWinSocket.


 
Anatoly Podgoretsky ©   (2009-09-10 16:07) [12]

Это я предлагаю написать свою функцию, что бы не трогать генофонд.

Не знаю связано ли это с спешкой или нет, они просто не тестировали и на Инглише проблема особо не заметна.

Вместо ReceiveText можно пользоваться ReceiveBuf


 
Сергей М. ©   (2009-09-10 16:09) [13]


> ReceiveBuf(Pointer(Result)^


Да, косяк именно в случае, когда Result является WideString.
Потому и [3]


 
Сергей М. ©   (2009-09-10 16:12) [14]


> что бы не трогать генофонд


Думаю, что его можно не трогать, если воспользоваться рантайм-пакетом scktcomp - вряд ли его перекомпиляли. Т.е. внутри него по-прежнему живут анси-строки


 
Anatoly Podgoretsky ©   (2009-09-10 16:15) [15]

Думаешь, что они и там устроили пакость?
Это же убийство, если в пакетах Ansi, а в dcu Unicode
Не думаю, просто они не стали трогать, как было написано string так и оставили, не меняя. А пакеты тоже перекомпилировали.


 
Сергей М. ©   (2009-09-10 16:21) [16]


> Думаешь, что они и там устроили пакость?


Все может быть ..

В принципе ты прав - в ситуации, когда разбираться с этой чехардой нет времени и/или неохота, написать свою функцию будет простейшим и лучшим решением.


 
Anatoly Podgoretsky ©   (2009-09-10 16:48) [17]

TServerSocket это компонент из Д7 вроде бы?


 
d@vinchi ©   (2009-09-10 16:55) [18]

Спасибо в очередной раз! переписывать метод не стал т.к. используется в только одном месте, траблу решил так:

var
sReceiveText: String;
...
 SetLength(sReceiveText, Socket.ReceiveBuf(Pointer(nil)^, -1));
 SetLength(sReceiveText, Socket.ReceiveBuf(Pointer(sReceiveText)^, Length(sReceiveText)));
...

далее работаем со строкой sReceiveText как обычно. Странно что эта ошибка даже в последних обновлениях на BDS 2009 не исправлена...


> Поскольку кроме ошибки с типом, также еще и SetLenght неверен,
>  итого в функии правильны только две строки, это BEGIN и
> END
> и таких мест множество, практически в каждой сетевой функции,
>  если используются строки. Эта же проблема и с рядом DB
> библиотек, точно также безответсвенно подошли и там.

самое страшное что это еще может много где всплыть...


 
Сергей М. ©   (2009-09-10 17:03) [19]


> var
> sReceiveText: String;


Да почему же опять String, а не AnsiString ?


 
d@vinchi ©   (2009-09-10 17:41) [20]

т.е. теперь про String вообще нужно забыть?


 
d@vinchi ©   (2009-09-10 17:43) [21]


> > var
> > sReceiveText: String;

это я скопипастил так, там естественно AnsiString...


 
Сергей М. ©   (2009-09-11 08:31) [22]


> теперь про String вообще нужно забыть?


В данном контексте String если и можно использовать, то совсем не так - ты в этом убедился, уведев "вопросы".


 
Anatoly Podgoretsky ©   (2009-09-11 11:08) [23]

> d@vinchi  (10.09.2009 17:41:20)  [20]

Строки они разные бывают и они разные все поддержаны, включая utf-8


 
evgeny2k ©   (2010-03-01 12:32) [24]

Я бы вот так написал (работает)

var
sReceiveText: AnsiString;
...
SetLength(sReceiveText, Socket.ReceiveLength());
SetLength(sReceiveText, Socket.ReceiveBuf(Pointer(sReceiveText)^, Length(sReceiveText)));

Или под Билдером
AnsiString _Str;

_Str.SetLength(Socket->ReceiveLength());
Socket->ReceiveBuf(_Str.c_str(), _Str.Length());
RichEdit1->Lines->Add(_Str);
Эх, не спроста они эти компоненты на палитру по-умолчанию не вывели...



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2013.05.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
2-1350581717
kristina
2012-10-18 21:35
2013.05.05
по нажатию клавиши Enter


15-1356815066
Mobile32.exe
2012-12-30 01:04
2013.05.05
Как сменить память для фоток на Самсунг?


15-1357488412
Dron983
2013-01-06 20:06
2013.05.05
Структура (Structure) кода в Delphi XE3


15-1357498708
AI
2013-01-06 22:58
2013.05.05
Языки искусственного интеллекта


15-1357086218
Дмитрий С
2013-01-02 04:23
2013.05.05
Вернуть Windows 7 способность к активации.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский