» »

C# in telnet

C# in telnet

tadejp81 ::

Pozdravljeni.

Pišem program v C#-ju, ki bi se prijavil v telnet strežnik in izvedel določen ukaz.

Na internetu sem za osnovo vzel minimalistic telnet knjižnice, vendar na žalost za moj sistem ne delujejo pravilno. Trenutno razrešujem slednje težave.

V glavnem sem ugotovil, da je težava naslednja:

TcpClient tcpSocket = new TcpClient("192.168.1.5", 23);
System.Threading.Thread.Sleep(1000);

tcpSocket.GetStream().WriteByte(255);
tcpSocket.GetStream().WriteByte(253);
tcpSocket.GetStream().WriteByte(1);

System.Threading.Thread.Sleep(1000);
tcpSocket.GetStream().ReadByte();


Z zgornjo kodo naj bi se poslalo ukaz "255 253 001" na IP 192.168.1.5 ter port 23, kar pomeni "IAC DO ECHO", vendar se tukaj pojavi težava, ker se ukaz ne pošlje v enem kosu - enem paketu, temveč ločeno.

V resnici se pošlje v enem paketu bajt 255, v drugem pa 253 ter 001. To se lepo vidi če pogledam zadevo z Wiresharkom.

V bistvu se zgodi tako, da se pri prvi uporabo ukaza tcpSocket.GetStream().WriteByte(int) pošlje sočasno le en bajt podatkov, pri vseh naslednjih uporabah, pa se vsi podatki zvrstijo zaporedoma v enem paketu.

Sedaj bi želel, da se ukaz pošlje v celoti v enem paketu, tako, da ga strežnik vidi kot:
1.
PACK1 "IAC DO ECHO"

in ne kot

2.
PACK1 "IAC"
PACK2 "DO ECHO"

Drugi paket se v tem primeru prepozna kot DATA in ne kot ukaz, ker mu manjka IAC predpona.

Če ima mogoče kdo kakšno idejo, predlog, se vam zahvaljujem za pomoč.

LP, Tadej
  • spremenil: tadejp81 ()

win64 ::

Prvo, kar je dobro za program, ampak ne bo rešilo problema je:
Stream stream = tcpSocket.GetStream();
stream.WriteByte(...);
stream.WriteByte(...);
stream.WriteByte(...);
sleep
stream.ReadByte();


2. Pozkusi poslat array bajtov (byte[])
stream.Write(new byte[]{(byte)255,(byte)253,(byte)1})
stream najbrž medpomni, zato poizkusi tudi zagnati stream.Flush()

3. Me pa zmoti branje, ker nimaš nobenega zagotovila, da boš po 1 sekundi dobil nazaj odziv. To se najbrž nimaš za bati pri taki količini podatkov. Ampak vseeno.

tadejp81 ::

Živjo.

win64, hvala za pomoč, tvoj predlog mi je pomagal.

Sadaj pišem v stream takole:
byte[] packet = { (byte)iac, (byte)verb, (byte)option };
tcpSocket.GetStream().Write(packet, 0, packet.Length);


Kar se pa tiče zgornje kode, je ta balj za ilustracijo, da sem lažje obrazložil problem, drugače imam bolj kompleksno zadevo.

Hvala še enkrat in lp.

Tadej


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] HTTPS client

Oddelek: Programiranje
173176 (1906) peterv6i
»

Socket Server

Oddelek: Programiranje
142431 (1624) fx
»

[C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?

Oddelek: Programiranje
51278 (1144) Mitja Bonča
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134338 (1418) Mrch
»

Kako pošiljanje datotek v JAVI.

Oddelek: Programiranje
141836 (1707) kopernik

Več podobnih tem