최소한의 텔넷을 사용하여 양식 프로젝트를 통해 텔넷 클라이언트를 백본으로 사용하고 있습니다. 협상 과정에서 클라이언트는 서버에 37 바이트의 데이터 바이트를 보냅니다. 이것이 IAC 인 경우 인증을위한 것입니다. 클라이언트와 서버간에 협상이 완료 될 때까지 전송 된 데이터가 없어야합니다.텔넷 협상에서 데이터 바이트가 누락됩니다. 이것은 어디서 오는 거니?
막혔습니다. 누군가 37 비트의 데이터 바이트를 자동으로 보내는 이유를 알아낼 수 있습니까? 이것은 wireshark를 사용하여 패킷을 스니핑 할 때 발견 된 것입니다. Void Parsetelnet 섹션은 전송이 발생하는 곳입니다.
Wireshark를 사용할 때 인증 옵션을 요구하는 서버 인스턴스가 없습니다. 그래서 나는 수업이 바이트 37을 얻는 곳을 잃어 버렸습니다. 나는 그것을 보내지 않아야합니다. 여기서 클래스
Telnet Authentication Option가using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
namespace STC_Control
{
enum Verbs
{
WILL = 251,
WONT = 252,
DO = 253,
DONT = 254,
IAC = 255
}
enum Options
{
SGA = 3
}
class TelnetConnection
{
TcpClient tcpSocket;
int TimeOutMs = 100;
public TelnetConnection(string Hostname, int Port)
{
tcpSocket = new TcpClient(Hostname, Port);
}
public void WriteLine(string cmd)
{
Write(cmd + "\n");
}
public void Write(string cmd)
{
if (!tcpSocket.Connected) return;
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF"));
tcpSocket.GetStream().Write(buf, 0, buf.Length);
}
public string Read()
{
if (!tcpSocket.Connected) return null;
StringBuilder sb = new StringBuilder();
do
{
ParseTelnet(sb);
System.Threading.Thread.Sleep(TimeOutMs);
} while (tcpSocket.Available > 0);
return sb.ToString();
}
public bool IsConnected
{
get { return tcpSocket.Connected; }
}
void ParseTelnet(StringBuilder sb)
{
while (tcpSocket.Available > 0)
{
int input = tcpSocket.GetStream().ReadByte();
switch (input)
{
case -1:
break;
case (int)Verbs.IAC:
// interpret as command
int inputverb = tcpSocket.GetStream().ReadByte();
if (inputverb == -1) break;
switch (inputverb)
{
case (int)Verbs.IAC:
//literal IAC = 255 escaped, so append char 255 to string
sb.Append(inputverb);
break;
case (int)Verbs.DO:
case (int)Verbs.DONT:
case (int)Verbs.WILL:
case (int)Verbs.WONT:
// reply to all commands with "WONT", unless it is SGA (suppres go ahead)
int inputoption = tcpSocket.GetStream().ReadByte();
if (inputoption == -1) break;
tcpSocket.GetStream().WriteByte((byte)Verbs.IAC);
if (inputoption == (int)Options.SGA)
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO);
else
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
tcpSocket.GetStream().WriteByte((byte)inputoption);
break;
default:
break;
}
break;
default:
sb.Append((char)input);
break;
}
}
}
}
}