Forum » Programiranje » 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:
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
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:
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.
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:
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
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [JAVA] HTTPS clientOddelek: Programiranje | 3176 (1906) | peterv6i |
» | Socket ServerOddelek: Programiranje | 2431 (1624) | fx |
» | [C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?Oddelek: Programiranje | 1278 (1144) | Mitja Bonča |
» | [C#] Simobilov GlasnikOddelek: Programiranje | 4338 (1418) | Mrch |
» | Kako pošiljanje datotek v JAVI.Oddelek: Programiranje | 1836 (1707) | kopernik |