Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Господа, посоветуйте плз, как отправить 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.038 c
1-1122121140
-virus-
2005-07-23 16:19
2005.08.14
OpenGL графика в проектах Delphi (книга)


1-1122511078
Alex_V
2005-07-28 04:37
2005.08.14
В чем причина?


11-1105023075
Boguslaw
2005-01-06 17:51
2005.08.14
How to pass string from TKOLThread to KOL form ?


1-1122487553
RusLAN_
2005-07-27 22:05
2005.08.14
TColor. Сделать цвет темнее/ярчею. Как?


4-1119514963
Amid
2005-06-23 12:22
2005.08.14
Как узнать права доступа к папке