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

Вниз

Работа с telnet   Найти похожие ветки 

 
sadel   (2006-04-27 09:22) [0]

Помогите кто-нибудь !!!
Как отправить байт данных = #03 серверу , чтобы он воспринял его как #03 , а не как CTRL-C ?
Иными словами , как сервер заставить воспринимать управляющие коды (0-31 ascii) , как байты данных ?


 
Сергей М. ©   (2006-04-27 09:32) [1]

Покажи сначала свой код отправки ..


 
sadel ©   (2006-04-27 09:46) [2]

Я использую компоненту tncnx
там посылка байта поисходит вот так :
if assigned(socket) then
result:=socket.send(@data,len)
else result:=-1;

echo возвращает все байты , но сервер воспринимает байт  #03 ,как ctrl-c


 
Сергей М. ©   (2006-04-27 10:39) [3]


> сервер воспринимает байт  #03 ,как ctrl-c


Покажи как объявлен data и как ты заполняешь буфер перед вызовом send

p.s.

http://book.itep.ru/4/45/tlnt_453.htm


 
sadel ©   (2006-04-27 12:00) [4]

При отправке байта происходит вот такой процесс

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomWSocket.PutDataInSendBuffer(Data : Pointer; Len : Integer);
var
   oBuffer  : TBuffer;
   cWritten : Integer;
   bMore    : Boolean;
begin
   if (Len <= 0) or (Data = nil) then
       exit;

   if FBufList.Count = 0 then begin
       oBuffer := TBuffer.Create(FBufSize);
       FBufList.Add(oBuffer);
   end
   else
       oBuffer := FBufList.Last;

   bMore := TRUE;
   while bMore do begin
       cWritten := oBuffer.Write(Data, Len);
       if cWritten >= Len then
           bMore := FALSE
       else begin
           Len  := Len - cWritten;
           Data := PChar(Data) + cWritten;
           if Len < 0 then
               bMore := FALSE
           else begin
               oBuffer := TBuffer.Create(FBufSize);
               FBufList.Add(oBuffer);
           end;
       end;
   end;
end;

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TBuffer.Write(Data : Pointer; Len : Integer) : Integer;
var
   Remaining : Integer;
   Copied    : Integer;
begin
   Remaining := FBufSize - WrCount;
   if Remaining <= 0 then
       Result := 0
   else begin
       if Len <= Remaining then
           Copied := Len
       else
           Copied := Remaining;
       Move(Data^, (PChar(Buf) + WrCount)^, Copied);
       WrCount := WrCount + Copied;
       Result  := Copied;
   end;
end;

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ Return -1 if error, else return number of byte written                    }

function TCustomWSocket.Send(Data : Pointer; Len : Integer) : integer;
begin
   if (FState <> wsConnected) and (FState <> wsSocksConnected) then begin
       WSocket_Synchronized_WSASetLastError(WSAENOTCONN);
       SocketError("Send");
       Result := -1;
       Exit;
   end;

   bAllSent := FALSE;
   if Len <= 0 then
       Result := 0
   else begin
       Result   := Len;
       PutDataInSendBuffer(Data, Len);
   end;

   if bAllSent then
       Exit;

   TryToSend;

   if bAllSent then begin
       { We post a message to fire the FD_WRITE message wich in turn will }
       { fire the OnDataSent event. We cannot fire the event ourself      }
       { because the event handler will eventually call send again.       }
       { Sending the message prevent recursive call and stack overflow.   }
       { The PostMessage function posts (places) a message in a window"s  }
       { message queue and then returns without waiting for the           }
       { corresponding window to process the message. The message will be }
       { seen and routed by Delphi a litle later, when we will be out of  }
       { the send function.                                               }
       PostMessage(Handle,
                   WM_ASYNCSELECT,
                   FHSocket,
                   MakeLong(FD_WRITE, 0));
   end;
end;

{***************************************************}
function  TTnCnx.Send(Data : Pointer; Len : Integer) : integer;
begin
   if Assigned(Socket) then
       Result := Socket.Send(Data, Len)
   else
       Result := -1;
end;

{***************************************}
procedure TForm1.Button4Click(Sender: TObject);
var  j:byte;

begin
J:=3;
tncnx1.send(@J,1);
end;


 
Сергей М. ©   (2006-04-27 12:23) [5]

Ты описание TELNET-протокола внимательно изучил ?
В каком режиме работает TELNET-сервер в момент когда ты ему #3 посылаешь ?


 
sadel ©   (2006-04-27 14:54) [6]

Я не совсем понимаю , как в этой компоненте режимы переключать
там просто есть функции

tncnx.send(data,len) и
tncnx.sendstr(str);

может есть где хороший примерчик телнет-клиента ?


 
Сергей М. ©   (2006-04-27 15:21) [7]


> Я не совсем понимаю


Ты описание протокола изучил или нет ?


 
sadel ©   (2006-04-27 16:10) [8]

В виндовском телнете есть возможность переключать режим
set mode console или
set mode stream

как это программно реализовать ?


 
Сергей М. ©   (2006-04-28 08:34) [9]

см. RFC 856 (Telnet Binary Transmission)


 
sadel ©   (2006-04-28 14:17) [10]

Классно ! Спасибо
необходимо дать команду телнет-серверу IAC WILL TRANSMIT-BINARY
Только после коннекта
idtelnet.connect  (компонент indy)
эта команда воспринимается уже как строка :(
Как же быть ?



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

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
15-1156327419
dera
2006-08-23 14:03
2006.09.17
Вопрос для тех, кто учился на Украине.


2-1156596558
angelika
2006-08-26 16:49
2006.09.17
горячие клавиши (ctrl+key)


1-1154467629
Германн
2006-08-02 01:27
2006.09.17
Недоумение в вопросе использования оператора CASE


4-1148029888
Wolfram
2006-05-19 13:11
2006.09.17
Как программно отключить жесткий диск?


15-1156616467
batya17
2006-08-26 22:21
2006.09.17
каую прогу посоветуете для создание инсталяшек?