Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Господа, посоветуйте плз, как отправить 16ричный код, в TcpClient [D7]


Layner ©   (2005-05-05 13:13:00) 

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-06 11:10:00) [1]

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


Layner   (2005-05-06 10:41:00) [2]

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


Digitman   (2005-05-06 09:31:00) [3]


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


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


Ozone   (2005-05-06 09:04:00) [4]

> [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))).


Ozone   (2005-05-06 08:56:00) [5]

>  [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-ричными значениями и потом отправляй.


Layner   (2005-05-06 08:48:00) [6]

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


Digitman   (2005-05-06 08:35:00) [7]


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


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

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


Layner   (2005-05-06 08:21:00) [8]

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?


Ozone   (2005-05-06 07:03:00) [9]

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

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

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

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


Layner   (2005-05-05 15:40:00) [10]

8-(


Layner   (2005-05-05 14:36:00) [11]

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


Layner   (2005-05-05 14:07:00) [12]

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

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

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


Layner   (2005-05-05 13:42:00) [13]

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


Layner   (2005-05-05 13:37:00) [14]

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


Digitman   (2005-05-05 13:33:00) [15]


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


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

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


Digitman   (2005-05-05 13:31:00) [16]


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


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


Layner   (2005-05-05 13:29:00) [17]

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


Layner   (2005-05-05 13:27:00) [18]

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


Ozone   (2005-05-05 13:26:00) [19]


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


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


Digitman   (2005-05-05 13:24:00) [20]


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


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


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо