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

Вниз

Господа, посоветуйте плз, как отправить 16ричный код, в TcpClient   Найти похожие ветки 

 
Layner ©   (2005-05-05 13:13) [0]

TcpClient1.Sendln("81c0"); Приходит не 16ричное значение, а такая же строка...
Полный код такой:
 TcpClient1.RemoteHost:="127.0.0.9";
 TcpClient1.RemotePort:="9999";
 TcpClient1.SockType:= stStream;
 TcpClient1.Connect;
 TcpClient1.Sendln("81c0");
 TcpClient1.Disconnect;

надо слать только 16значение.. Что бы пакет выглядел так:
0x0000   00 0B 46 D5 8B 00 00 0D-60 EC 76 60 08 00 45 00   ..FÕ‹...`ìv`..E.
0x0010   00 4F D4 DB 40 00 80 06-00 00 AC 15 51 DC AC 15   .OÔÛ@.?...¬.Qܬ.
0x0020   05 D0 12 78 13 8D D5 64-1A B1 44 05 64 62 50 18   .Ð.x.Õd.±D.dbP.
0x0030   FF F3 B0 18 00 00 81 C0

2 последние значения пересылаемое значение, остальное это заголовок TCP пакета.
Заранее благодарю.


 
Digitman ©   (2005-05-05 13:24) [1]


> Приходит не 16ричное значение, а такая же строка


строку отправил - строку же и принял ... чему ж тут удивляться ?


> как отправить 16ричный к


именно строку в 16-ричном коде ты и отправляешь .. ее же и жди ..

а если не строку, то ни о каком 16-ричном коде не может идти и речи : 16-ричный код - это не иначе как строковое представление некоего значения


 
Ozone ©   (2005-05-05 13:26) [2]


> TcpClient1.Sendln("81c0"); Приходит не 16ричное значение,
> а такая же строка...


Чего-т не понял.... Ты отсылаешь строку, получаешь строку... Что не устраивает?


 
Layner ©   (2005-05-05 13:27) [3]

В общем сейчас приходит вместо 81 C0 (2 посл. символа в вышеприведенном листинге) - 38 31 63 30 30 ... А надо чисто, если шлю TcpClient1.Sendln("81c0"); (слать видимо не так надо) то получить 81 C0


 
Layner ©   (2005-05-05 13:29) [4]

Да, все верно, шлется именно строкой, Sendln переводит все в строку, а как отправить то, что подготовил (состряпал я сам 16ричное значение, теперь бы его отправить..)?


 
Digitman ©   (2005-05-05 13:31) [5]


> Layner ©   (05.05.05 13:27) [3]


либо посылай не строку, а WORD-переменную, содержащую значение $c081, либо посылай-принимай строку. а после приема строки преобразовывай ее значение WORD-типу (см. StrToInt() )


 
Digitman ©   (2005-05-05 13:33) [6]


> Sendln переводит все в строку


ничего она не "переводит".

вызвав Sendln() ты тем самым сказал : передать (Send) строку (Line) , и указал какую конкретно строку следует передать


 
Layner ©   (2005-05-05 13:37) [7]

Digitman
Спасибо, а как моим способом отправить WORD значение?


 
Layner ©   (2005-05-05 13:42) [8]

Скорей всего TcpClient1.SendTo, сейчас попробую :)


 
Layner ©   (2005-05-05 14:07) [9]

А никто случайно не знает, как перечислить параметры в SendTo? В справке есть

Delphi syntax:
function SendTo: (var buf; bufsize: integer; ToAddr: TSockAddr; flags: integer = 0): integer;

Что вставить в моем случае в TSockAddr?


 
Layner ©   (2005-05-05 14:36) [10]

Вопросы продолжаются, может воспользоваться другими компанентами, не TTcpClient? Замаялся уже отправлять свою строку :(
Результат должен быть такой, есть программа, которая принимает данные. Данные строго типолизированные, т.е. первые 2 байта на метку, ещё 4 байта на время, ещё 4 байта на служебную инфу... такие дела, и как слать эти байты, понять не могу. Строку слать, нет проблем. Написать побуквенно, что надо слать, тоже нет проблем. Но строку (string) не принимает приёмная программа. Т.к. у каждого символа там уже совсем другие байты.
Т.е. шлю я например 10, а на приемник приходит 31 30 0D 0A 00 00, хотя надо получить 1 байт -10...


 
Layner ©   (2005-05-05 15:40) [11]

8-(


 
Ozone ©   (2005-05-06 07:03) [12]

> [8] Layner ©   (05.05.05 13:42)

Что за компоненты используешь? Чего-т не пойму... На Indy похоже по названию, но на TCP клиенте у него нет такой функции...

> Что вставить в моем случае в TSockAddr?

Заполненную структуру с адресом и портом сервера ессно.


 
Layner ©   (2005-05-06 08:21) [13]

Ozone
Компанент с вкладки Internet в D7, TcpClient1: TTcpClient;
Структуру понятно, а в таком случае
TcpClient1.RemoteHost:="127.0.0.9";
TcpClient1.RemotePort:="9999";

Не заполнять?
В моем случае, пишу так
procedure TForm1.Button3Click(Sender: TObject);
var
Addr: TSockAddr;
begin
Addr.sin_family := AF_INET;
Addr.sin_addr.S_addr := INADDR_ANY;
Addr.sin_port := htons(9999);
TcpClient1.SendTo($5, 2, Addr, 0);  //<ошибка [Error] Unit1.pas(73): Constant object cannot be passed as var parameter
end;


Перефразирую вопрос, как можно отправить 16тиричные значения по сети TCP/IP, есть порт и IP?


 
Digitman ©   (2005-05-06 08:35) [14]


> как можно отправить 16тиричные значения


именно так как ты и отправлял их до сих пор - строкой

а то что хранится в переменной типа WORD - это НЕ 16тиричное значение, это просто некое значение.


 
Layner ©   (2005-05-06 08:48) [15]

Digitman ©   (06.05.05 08:35)
Хорошо, а вот так:
TcpClient1.Sendln("81c0");
Присылаются же не 16ричшые значения, а простая строка? А как тогда скинуть 16ричные? Отправлять WORD? А как слать WORD через Sendln?


 
Ozone ©   (2005-05-06 08:56) [16]

>  [13] Layner ©   (06.05.05 08:21)

Заполнять можешь функцией GetSocketAddr.


> TcpClient1.SendTo($5, 2, Addr, 0);  //<ошибка [Error] Unit1.pas(73):
> Constant object cannot be passed as var parameter


Сам же писал синтаксис SendTo в [9]. Заполняй сначала буфер 16-ричными значениями и потом отправляй.


 
Ozone ©   (2005-05-06 09:04) [17]

> [15] Layner ©   (06.05.05 08:48)

Т.е. делаешь buf типа array [0..N] of WORD, заполняешь buf[0] = $FFF и т.п. и отправляешь SendTo(buf, sizeof(buf), addr). Но, перед этим неплохо бы серверу знать размер буфера, поэтому сначала можешь послать его SendLn(IntToStr(sizeof(buf))).


 
Digitman ©   (2005-05-06 09:31) [18]


> Присылаются же не 16ричшые значения, а простая строка?


"присылается" строка, содержащая 16-ричное представление некоего числового значения


 
Layner ©   (2005-05-06 10:41) [19]

Ozone ©   (06.05.05 09:04)
Огромное спасибо! Теперь то понял, как WORD слать через SendTo, теперь все ОК!, формирую пакет какой мне надо, и приходит то что надо!
Всех поздравляю с наступающими праздниками 9 мая!!!


 
Digitman ©   (2005-05-06 11:10) [20]

сервер на то и сервер, чтобы быть "умным".. в отличие от клиента ..



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

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

Наверх





Память: 0.5 MB
Время: 0.012 c
1-1122059658
Spartak
2005-07-22 23:14
2005.08.14
Глюки TListView


14-1121778131
oldman
2005-07-19 17:02
2005.08.14
Ну надо же было так прогнуться...


14-1121920522
Fin
2005-07-21 08:35
2005.08.14
Для чего нужна папка temp&amp;


14-1121898253
Германн
2005-07-21 02:24
2005.08.14
Последний нонешний денёчек


14-1122284005
MegaVolt
2005-07-25 13:33
2005.08.14
Что именно я в правилах нарушил?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский