![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с telnet [D5, WinXP]
sadel © (2006-04-27 09:22:00)Помогите кто-нибудь !!!
Как отправить байт данных = #03 серверу , чтобы он воспринял его как #03 , а не как CTRL-C ?
Иными словами , как сервер заставить воспринимать управляющие коды (0-31 ascii) , как байты данных ?
sadel (2006-04-28 14:17:00) [1]Классно ! Спасибо
необходимо дать команду телнет-серверу IAC WILL TRANSMIT-BINARY
Только после коннекта
idtelnet.connect (компонент indy)
эта команда воспринимается уже как строка :(
Как же быть ?
Сергей М. (2006-04-28 08:34:00) [2]см. RFC 856 (Telnet Binary Transmission)
sadel (2006-04-27 16:10:00) [3]В виндовском телнете есть возможность переключать режим
set mode console или
set mode stream
как это программно реализовать ?
Сергей М. (2006-04-27 15:21:00) [4]
> Я не совсем понимаю
Ты описание протокола изучил или нет ?
sadel (2006-04-27 14:54:00) [5]Я не совсем понимаю , как в этой компоненте режимы переключать
там просто есть функции
tncnx.send(data,len) и
tncnx.sendstr(str);
может есть где хороший примерчик телнет-клиента ?
Сергей М. (2006-04-27 12:23:00) [6]Ты описание TELNET-протокола внимательно изучил ?
В каком режиме работает TELNET-сервер в момент когда ты ему #3 посылаешь ?
sadel (2006-04-27 12:00:00) [7]При отправке байта происходит вот такой процесс
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
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 10:39:00) [8]
> сервер воспринимает байт #03 ,как ctrl-c
Покажи как объявлен data и как ты заполняешь буфер перед вызовом send
p.s.
http://book.itep.ru/4/45/tlnt_453.htm
sadel (2006-04-27 09:46:00) [9]Я использую компоненту tncnx
там посылка байта поисходит вот так :
if assigned(socket) then
result:=socket.send(@data,len)
else result:=-1;
echo возвращает все байты , но сервер воспринимает байт #03 ,как ctrl-c
Сергей М. (2006-04-27 09:32:00) [10]Покажи сначала свой код отправки ..