nonsense char on telnet client

hello all
i am trying the telnet example

this is the code i used

/*
  Telnet client

 This sketch connects to a a telnet server (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.  You'll need a telnet server
 to test this with.
 Processing's ChatServer example (part of the network library) works well,
 running on port 10002. It can be found as part of the examples
 in the Processing application, available at
 http://processing.org/

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13

 created 14 Sep 2010
 modified 9 Apr 2012
 by Tom Igoe

 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Enter the IP address of the server you're connecting to:
IPAddress server(192, 168, 1, 1);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use port 10002):
EthernetClient client;

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  int i=0;
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // give the Ethernet shield a second to initialize:
  delay(3000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 23)) {
    Serial.println("connected");
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
   

}


void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
 while (client.available()) {
    char c = client.read();
    
    Serial.print(c);
   
  }



  
  // as long as there are bytes in the serial queue,
  // read them and send them out the socket if it's open:
//  while (Serial.available() > 0) {
//    char inChar = Serial.read();
//    if (client.connected()) {
//      client.print(inChar);
//    }
//  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    // do nothing:
    while (true);
  }
}

th earduino is connected to a router and i am trying to telnet
when i telnet from the pc , the router sends a line then it asks for the user name

i want to let the arduino send the username and get access to the router via port 23, after i run the program the serial monitor shows this

connecting...
connected
ے‎ے‎ ے‎#ے‎'

i tried all the baud rates in the serial monitor, and still cant make sense of that
is this the line sent by the router or what is it?
and how can i make the arduino send the username? should i use client.println() function?

thanks

Did you try a different telnet server?

That could be part of the Telnet protocol. A Telnet server and client negotiate features and configuration with non-printable (or nonsense) bytes. Your program could recognize when it's receiving a Telnet negotiation message and ignore it (don't write it to Serial).

Edit to add: See https://tools.ietf.org/html/rfc854 for reference.

aarg: Did you try a different telnet server?

like what? i want the arduino to send request as client to the router

christop: That could be part of the Telnet protocol. A Telnet server and client negotiate features and configuration with non-printable (or nonsense) bytes. Your program could recognize when it's receiving a Telnet negotiation message and ignore it (don't write it to Serial).

Edit to add: See https://tools.ietf.org/html/rfc854 for reference.

when i use telnet from pc i get this

Login:

it asks for login, and the pc can read that why the arduino can't?

thank you for your reply

it asks for login, and the pc can read that why the arduino can't?

Perhaps the telnet option negotiation that it implements does not continue if it doesn't get responses to the negotiation? Internet protocols are traditionally a bit lax when it comes to specifying what should happen when there are "errors."

Print out the traffic in hex or decimal, so we can see what the options are, and create a suitable "lie" in response.

westfw: Perhaps the telnet option negotiation that it implements does not continue if it doesn't get responses to the negotiation? Internet protocols are traditionally a bit lax when it comes to specifying what should happen when there are "errors."

Print out the traffic in hex or decimal, so we can see what the options are, and create a suitable "lie" in response.

printing the reply as hex gave this

FFFFFFFFFFFFFFFD18FFFFFFFFFFFFFFFD20FFFFFFFFFFFFFFFD23FFFFFFFFFFFFFFFD27

how can i know if the it is asking for the login infos or if it is an error? and how can i send the username and password?

i tried client.println("admin") after reading from the server but i get no reply

Ugh. Those are weird options, I think. (X-terminal localtion, environment, ...) What kind of router is it?

I have a better idea. On the PC, instead of saying 'telnet router', turn on debug mode. It probably looks something like: C:> telnet telnet> set debug telnet> open router

You can also use wireshark to snif your telnet session between the PC and the router. In combination with the earlier mentioned tfc and possibly the debug outout (never knew it existed), you can happily reverse engineer and have fun.

westfw: Ugh. Those are weird options, I think. (X-terminal localtion, environment, ...) What kind of router is it?

I have a better idea. On the PC, instead of saying 'telnet router', turn on debug mode. It probably looks something like: C:> telnet telnet> set debug telnet> open router

i honestly didnt understand what you mean i need to use arduino to send telnet commands after sending login

like i do in cmd, i write telnet ip, then enter login and password, then send commands i need to do the same but using arduino, , it is a mikrotik router.

sterretje: You can also use wireshark to snif your telnet session between the PC and the router. In combination with the earlier mentioned tfc and possibly the debug outout (never knew it existed), you can happily reverse engineer and have fun.

i never did any reverse engeneering i hope it isnt hard so i should sniff the packages sent between pc and router from the router itself, there is a packets sniffer in the routeros, but didnt understands how to use it, i used to to make sure if there is data transfer between arduino and the router

i just need to send some telnet commands! sorry for being a noob and thanks for your replies

FFFFFFFFFFFFFFFD18FFFFFFFFFFFFFFFD20FFFFFFFFFFFFFFFD23FFFFFFFFFFFFFFFD27
how can i know if the it is asking for the login infos or if it is an error?

Assuming sign extension, you have IAC DO 24 (terminal-type), IAC DO 32 (terminal speed), IAC DO 35 (X Display location), IAC DO 39 (New Environment Option.) Those are a bit odd to see as the first negotiation on the connection, but they’re not totally off-the-wall.) (Sigh. I guess decimal would have been better. And “c” should be unsigned.)

In theory, you should be able to do

[color=brown]Client.write("\0xFF\xFC\18\0xFF\xFC\x20\0xFF\xFC\x23\0xFF\xFC\x27");
[/color]

sometime before the loop, and it will refuse all those negotiations. But I fear that may just get you to the next phase of negotiations.

In theory, you can add a state machine to properly negotiate options that you SHOULD be supporting. But it’s pretty much a guess as to whether things will work if you don’t support what they want you to support. (In theory, you end up with a half-duplex connection with local echoing, and need an explicit turn-around signal. But no one has done that, since back in the 70s.)

westfw: Assuming sign extension, you have IAC DO 24 (terminal-type), IAC DO 32 (terminal speed), IAC DO 35 (X Display location), IAC DO 39 (New Environment Option.) Those are a bit odd to see as the first negotiation on the connection, but they're not totally off-the-wall.) (Sigh. I guess decimal would have been better. And "c" should be unsigned.)

In theory, you should be able to do

[color=brown]Client.write("\0xFF\xFC\18\0xFF\xFC\x20\0xFF\xFC\x23\0xFF\xFC\x27");
[/color]

sometime before the loop, and it will refuse all those negotiations. But I fear that may just get you to the next phase of negotiations.

thanks for your reply again

i tried and it made no difference, i put before the loop,

if (client.connect(server, 23)) { Serial.println("connected"); delay(500); client.write("\0xFF\xFC\18\0xFF\xFC\x20\0xFF\xFC\x23\0xFF\xFC\x27");

but it made no difference

maybe i should try another mikrotik?