Programmering(C#) Hjälp med TelNet

Permalänk
Medlem

Programmering(C#) Hjälp med TelNet

Tjenare! Jag försökte med en enkel sak, att bara kunna kommunicera med med en minecraft server. Servern som jag försöker kommunicera med fungerar fint för andra TelNet applications fungerar fint.

När man connectar till servern så ska man få till baka "Username:" men jag får bara tillbaka "??". Så någonting är galet.

Här är koden:
http://codeviewer.org/view/code:21eb

Här är en bild på hur det ser ut när man connectar:
http://gamehelp.se/rillesfiler/filer/rille/hj%C3%A4lp.jpg

Hoppas någon här vet hur man gör, för detta är viktigt

Tack!

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem

Innehåller data något vettigt?

Permalänk
Medlem

Det beror nog på att du använder en TCP-anslutning rakt av. Du behöver nog någon slags Telnet-klient för C#.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Det du gör är att du skapar en TcpClient instans och även hämtar en ström ifrån den. Men att bara skapa en instans innebär inte att du faktiskt etablerar en anslutning. TcpClient har någon form utav Connect metod som du behöver kalla på.

Visa signatur

In order to understand recursion, one must first understand recursion

Permalänk
Medlem
Skrivet av Elgot:

Innehåller data något vettigt?

Efter att jag har försökt läsa av så innehåller de 3 första elementen i data 255, 251, 1 och resten är 0.

Skrivet av pkzlol:

Det du gör är att du skapar en TcpClient instans och även hämtar en ström ifrån den. Men att bara skapa en instans innebär inte att du faktiskt etablerar en anslutning. TcpClient har någon form utav Connect metod som du behöver kalla på.

Jag har ändrat det nu, så nu använder jag mig utav client.Connect("213.**.***.***", port);. Men resultaten blir det samma...

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av Phod:

Det beror nog på att du använder en TCP-anslutning rakt av.

Telnet är väl ofta inte svårare än så?

Skrivet av riille:

Jag har ändrat det nu, så nu använder jag mig utav client.Connect("213.**.***.***", port);. Men resultaten blir det samma...

Vad händer om du ansluter till något mera välkänt; svenskMUD till exempel?
svenskmud.net:2046

Permalänk
Medlem
Skrivet av Elgot:

Vad händer om du ansluter till något mera välkänt; svenskMUD till exempel?
svenskmud.net:2046

Då tar jag emot detta:

"Received: V?lkommen till SvenskMUD, muddet p? svenska.

V?lj g?rna ett namn med anknytning till den nordiska
mytologin eller de nordiska traditionerna f?r att det
ska passa in s? bra som m?jligt.

Logga in som 'g?st' om du bara skall titta lite.

Vad heter d"

Om det kan vara till någon hjälp så så länkar jag pluginet jag använder till minecraft servern:
http://forums.bukkit.org/threads/admn-remotetoolkit-r10-a12-r...
andra TCP klienter fungerar(puttytel) att connecta till den och så. Men inte min, får ju bara tillbaka "??".
Denna error kommer upp i minecraft-server consollen när jag använder mitt program och inte någon annan klient:

Citat:

Unexpected error in shell!
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.DataOutputStream.flush(Unknown Source)
at net.wimpi.telnetd.io.TelnetIO.flush(Unknown Source)
at net.wimpi.telnetd.io.TerminalIO.flush(Unknown Source)
at net.wimpi.telnetd.io.TerminalIO.doErase(Unknown Source)
at net.wimpi.telnetd.io.TerminalIO.eraseScreen(Unknown Source)
at com.drdanick.McRKit.Telnet.ConsoleShell.run(ConsoleShell.java:38)
at net.wimpi.telnetd.net.Connection.run(Unknown Source)
2012-jan-14 17:10:47 net.wimpi.telnetd.net.ConnectionManager cleanupClosed
INFO: cleanupClosed():: Removing closed connection Thread[Connection30,5,]

Tack för eran hjälp uppskattar verkligen att ni hjälper till

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Denna error kommer upp i minecraft-server consollen när jag använder mitt program och inte någon annan klient:

Det den klagar på verkar dock främst vara att anslutningen kopplas ned. Detta bör inträffa när man lämnar connect_click (alltså efter att ditt problem uppstår), men man skulle kunna testa att flytta ut TcpClient client ur funktionen. Kanske bör man också, med hjälp av client.Available, se till att det verkligen finns data att läsa innan man kör client.Read.

Permalänk
Medlem
Skrivet av Elgot:

Det den klagar på verkar dock främst vara att anslutningen kopplas ned. Detta bör inträffa när man lämnar connect_click (alltså efter att ditt problem uppstår), men man skulle kunna testa att flytta ut TcpClient client ur funktionen. Kanske bör man också, med hjälp av client.Available, se till att det verkligen finns data att läsa innan man kör client.Read.

Jag flyttade ut TcpClient client utanför funktionen och gjorde en check att jag var connectad innan jag började läsa av från servern if (client.Connected). Men fortfarande samma resultat. Har du några mer förslag?

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Har du några mer förslag?

Man skulle som sagt kunna testa att köra

while(client.Available < 9) System.Threading.Thread.Sleep(1);

innan man läser från strömmen; kanske är man bara för snabb?

Permalänk
Medlem

Kan du beskriva mer exakt hur protokollet ser ut när man skall ansluta? Vad händer efter att du fått tillbaka "username:.." ?

Visa signatur

In order to understand recursion, one must first understand recursion

Permalänk
Avstängd

Varför inte = client.Connect("213.**.***.***", 25568)

Visa signatur

iPeek #1: AMD 1100T @ 4.8GHz 16GB @H2O
iPeek #1: AMD 1100T @ 4.8GHz 16GB @H2O
iPeek #1: INTEL CELERON @ 2.80GHz 1GB
iPeek #2: INTEL ATOM x8 @ 2.80GHz 4GB
Skollaptop: Macbook AIR 13" 2011, 128GB, 4GB

Permalänk
Medlem
Skrivet av Elgot:

Man skulle som sagt kunna testa att köra

while(client.Available < 9) System.Threading.Thread.Sleep(1);

innan man läser från strömmen; kanske är man bara för snabb?

Mannen! Det fungerade, tack så mycket.!

Men ett nytt porblem har dykt upp. Nu när vi ska skicka tillbaka en string så får vi upp en error:

http://gamehelp.se/rillesfiler/filer/rille/problem453.jpg

Vad är felet denna gång?

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Mannen! Det fungerade, tack så mycket.!

Trevligt. Dock bör man kanske uppgradera till ett något mera robust system; man kan till exempel, i en egen tråd, ha en loop som ständigt kontrollerar om något finns att läsa och i så fall läser in det sist i en buffert (och annars sover) samt undersöker om bufferten innehåller något vettigt. Textprotokoll som det där är lite besvärliga då man ofta inte kan veta om man verkligen har mottagit allt som har skickats (ibland vet man dock att meddelanden alltid avslutas med en radbrytning eller så).

Skrivet av riille:

Men ett nytt porblem har dykt upp. Nu när vi ska skicka tillbaka en string så får vi upp en error:

Det ser ut som att anslutningen är nedkopplad igen (har du kört connect?).

Permalänk
Medlem
Skrivet av riille:

Mannen! Det fungerade, tack så mycket.!

Men ett nytt porblem har dykt upp. Nu när vi ska skicka tillbaka en string så får vi upp en error:

Vad är felet denna gång?

Prova att deklarera streamen globalt istället för att hämta den varje gång du vill skicka något.

Förövrigt vill du nog helst använda UTF8Encoding för att läsa/göra bytes av strängar,

UTF8Encoding encoder = new UTF8Encoding();
encoder.GetBytes("Hejsan minecraft server");

Permalänk
Medlem
Skrivet av Elgot:

Trevligt. Dock bör man kanske uppgradera till ett något mera robust system; man kan till exempel, i en egen tråd, ha en loop som ständigt kontrollerar om något finns att läsa och i så fall läser in det sist i en buffert (och annars sover) samt undersöker om bufferten innehåller något vettigt. Textprotokoll som det där är lite besvärliga då man ofta inte kan veta om man verkligen har mottagit allt som har skickats (ibland vet man dock att meddelanden alltid avslutas med en radbrytning eller så).

Det ser ut som att anslutningen är nedkopplad igen (har du kört connect?).

Måste man köra connect igen? Jag har redan gjort det högra upp i koden.

När jag connectar första gången och läser av så vill den att jag ska skicka tillbaka ett användarnamn. Men det är det som jag inte kan skicka tillbaka som du ser på bilden.

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Måste man köra connect igen? Jag har redan gjort det högra upp i koden.

Nej, förutsatt att det verkligen är samma socket som du körde connect på som används (och att den andra sidan inte har kopplat ned) borde det fungera. (Hade du för övrigt client som klassmedlem? I så fall behöver du inte skicka med den som parameter till send.)

Permalänk
Medlem
Skrivet av Elgot:

Nej, förutsatt att det verkligen är samma socket som du körde connect på som används (och att den andra sidan inte har kopplat ned) borde det fungera. (Hade du för övrigt client som klassmedlem? I så fall behöver du inte skicka med den som parameter till send.)

Jag tog bort client som parameter i send. Men programmet hänger sig så fortfarande när jag försöker skicka... Här kommer min kod så att ni som kan detta lite bättre kan ta en titt:
http://codeviewer.org/view/code:21f0

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Jag tog bort client som parameter i send. Men programmet hänger sig så fortfarande när jag försöker skicka... Här kommer min kod så att ni som kan detta lite bättre kan ta en titt:
http://codeviewer.org/view/code:21f0

Kraschar det som förut eller hänger det sig bara (typiskt på grund av att du väntar tills 30 byte finns medan det svar man får kanske inte är så långt)? För övrigt behöver du inte vänta innan du anropar read() i skickaknapp_Click(). Nu vet jag förvisso inte hur protokollet ser ut, men det är också vanligt att man måste skicka en extra radbrytning för att mottagaren skall behandla kommandot man har skickat.

Permalänk
Medlem
Skrivet av Elgot:

Telnet är väl ofta inte svårare än så?

Det beror ju på vad man ansluter till. Telnet är ju inte bara text över TCP: RFC 854

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem
Skrivet av Elgot:

Kraschar det som förut eller hänger det sig bara (typiskt på grund av att du väntar tills 30 byte finns medan det svar man får kanske inte är så långt)? För övrigt behöver du inte vänta innan du anropar read() i skickaknapp_Click(). Nu vet jag förvisso inte hur protokollet ser ut, men det är också vanligt att man måste skicka en extra radbrytning för att mottagaren skall behandla kommandot man har skickat.

Tog bort väntan innan read vet inte varför den var där.

Just nu så kraschar bara programmet och det fungerade ändå inte om jag lägger till en radbrytning.

Edit:
Jag fixade lite grejer nu, stängde stream när jag var klar med den osv.

Nu kommer den förbi send funktionen utan någon error men istället så blir det en error vid read funktionen. Det är ju ett tecken på att den klarade send funktionen.

http://gamehelp.se/rillesfiler/filer/rille/problem13123.jpg

Lägger vi då NetworkStream stream = client.GetStream(); innan loopen så blir det detta felet:

http://gamehelp.se/rillesfiler/filer/rille/knarke.jpg

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Medlem

Båda dina senaste fel pekar på att din socket är stängd. I första felet försöker du kolla "Available" propertyn på din "client", som nu inte är initierad (stänger du den någonstans?). Andra felet är att du försöker hämta en ström från din "client", som fortfarande inte är initierad.

Var ett tag sedan jag satt med nätverksappar men om jag minns någorlunda så lägg din TcpClient samt ström längst upp i istället och låt de vara. När du väl har initierat de så skall du inte behöva göra det igen.

Visa signatur

In order to understand recursion, one must first understand recursion

Permalänk
Hedersmedlem

Den där stream.Close() i read() ser lite farlig ut; ta bort den.

Permalänk
Medlem

stream.Close(); är borta nu i read.

I send använder jag mig ut av stream.Close() efter att jag har försökt att skicka till servern.

Om jag inte använder stream.Close(); i send så hänger sig programmet. Om jag använder stream.Close(); i send så får jag detta meddelande:

Citat:

System.InvalidOperationException: Åtgärden stöds inte för socketar som inte är anslutna.
vid System.Net.Sockets.TcpClient.GetStream()
vid Minecraft_Server_Klient.Form1.read() i C:\Users\Rille\documents\visual studio 2010\Projects\Minecraft Server Klient\Minecraft Server Klient\Form1.cs:rad 60

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

[B]Om jag inte använder stream.Close(); i send så hänger sig programmet.

Det skall inte behövas (tvärt om kopplar det sannolikt ned anslutningen helt). Har du testat att avsluta sändningen med en radbrytning, kanske

Byte[] data = System.Text.Encoding.ASCII.GetBytes(message+'\n');

Permalänk
Medlem
Skrivet av Elgot:

Det skall inte behövas (tvärt om kopplar det sannolikt ned anslutningen helt). Har du testat att avsluta sändningen med en radbrytning, kanske

Byte[] data = System.Text.Encoding.ASCII.GetBytes(message+'\n');

Japp radbrytning har jag med... Verkar ju konstigt att programmet hänger sig om jag skippar stream.Close();

Detta är så konstigt... För read funktionen fungerar ju en gång och sen när jag skickar tillbaka och ska läsa av igen så skiter det sig :/

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Medlem

Jag skriv ihop ett program som du kan kika på för att läsa ordentligt. Det går att göra detta på olika sätt, detta är bara ett av dem.

Detta läser på en egen tråd, UpdateOutput-metoden körs på huvudtråden när något nytt har lästs från socketen.
Eftersom socketen körs i non-blocking-läge så kan du ta hand om att skicka och ta emot data på samma tråd, vilket är vettigt.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; namespace SockRead { public partial class Form1 : Form { bool _closing; public Form1() { InitializeComponent(); _closing = false; new Thread(Run).Start(); this.FormClosing += (s, e) => _closing = true; } void UpdateOutput(string message) { listBox1.Items.AddRange(message.Split(new string[]{ Environment.NewLine }, StringSplitOptions.None)); } private void Run() { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var receive_buffer = new byte[1024]; var update_output = new Action<string>(UpdateOutput); socket.Connect("svenskmud.net", 2046); socket.Blocking = false; socket.ReceiveBufferSize = 1024 * 1024; while (!_closing) { if (socket.Poll(100, SelectMode.SelectRead)) { // Kolla effter disconnects if (!socket.Connected || socket.Available == 0) break; if (socket.Available > receive_buffer.Length) receive_buffer = new byte[socket.Available]; int len = socket.Receive(receive_buffer, socket.Available, SocketFlags.None); this.Invoke(update_output, System.Text.Encoding.ASCII.GetString(receive_buffer, 0, len)); } Thread.Sleep(10); } if (socket.Connected) socket.Disconnect(false); } } }

Permalänk
Hedersmedlem
Skrivet av riille:

Japp radbrytning har jag med... Verkar ju konstigt att programmet hänger sig om jag skippar stream.Close();

Var är det det hänger sig (och på vilket sätt)? Och har du testat att på samma sätt skicka ett namn till svenskmud när de frågar?

Permalänk
Medlem

Sotai ska kolla på det där.

Elgot, det hänger sig när jag trycker på send. När den först ska skicka och sen läsa. den hänger sig så att det inte går att trycka på någonting, går inte att kryssa den heller så måste trycka SHIFT + F5 för att stänga.

Bra idé varför har jag inte testat det? Jag testade det nu och det fungerar fint med att kommunicera med svenskmud. Då är ju frågan varför fungerar det inte det andra?

Visa signatur

Det är bättre att fråga och verka dum, än att inte fråga och förbli det.

Permalänk
Hedersmedlem
Skrivet av riille:

Elgot, det hänger sig när jag trycker på send. När den först ska skicka och sen läsa. den hänger sig så att det inte går att trycka på någonting, går inte att kryssa den heller så måste trycka SHIFT + F5 för att stänga.

Om du trycker på pausknappen ser du vad programmet håller på med. (Jag misstänker dock att du väntar tills 30 byte finns tillgängliga men att det svar som skickas inte är så långt. Man bör nog, som sagt, ha ett något mera robust system...)