Telnet, Socket und der Linemode.



  • Hallo Community,

    Ich probiere gerade,nach dem ich mir ein bisschen die Sockets angeguckt habe, einen kleinen 'telnetserver' zu bauen - naja im Grunde will ich mich nur per Telnet auf den Socket verbinden können, und Text schicken - allerdings nicht per Zeichen soner per Line. Laut der Telnet Doku gibt es einen Linemode, aber irgendwie bekomm ich es nicht gepacken das es jenen benutzt so wie es im moment ist schickt er zwar, aber auch wieder nur per Buchstabe und ich habe keien Ausgabe mehr.

    Wäre cool wenn mir da jemand helfen könnte.

    #include <iostream>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <windows.h>
    
    #define  SERVER_PORT             5432
    #define  RECV_BUF_MAXLEN         256
    #define  SEND_BUF_MAXLEN         256
    
    //Telnet Code definition:
    #define CMD_IAC		255
    #define CMD_WILL	251
    #define CMD_WONT	252
    #define CMD_DO		253
    #define CMD_DONT	254
    #define CMD_LINEMODE   34
    #define CMD_GOAHEAD   3
    #define CMD_ECHO   1
    
    using namespace std;
    long WinsockStartup();//proto
    
    int main()
    {
      long   rc;
    
      SOCKET sockListen;
      SOCKET sockConnected;
      SOCKADDR_IN addr;
      int addrlen = sizeof(addr);
    
      char sendBuf[SEND_BUF_MAXLEN+1];
      char recvBuf[RECV_BUF_MAXLEN+1];
    
      addr.sin_addr.s_addr = htonl(INADDR_ANY);
      addr.sin_family = AF_INET;
      addr.sin_port = htons(SERVER_PORT);
    
      const char linemode[] = {CMD_IAC, CMD_DO, CMD_LINEMODE, 0}; // Auf Linemode setzen
      const char echomode[] = {CMD_IAC, CMD_WILL, CMD_ECHO, 0};// Auf Echo Mode setzen
    
      rc = WinsockStartup(); //Initialisierung des Socktest (Funktion siehe unten)
      sockListen=socket(AF_INET,SOCK_STREAM,0); //listen Socket init
      rc = bind(sockListen, (SOCKADDR*)&addr, sizeof(addr)); //listen socket an Port binden
      rc = listen(sockListen, 0); //listen on listen;)
      cout << "Waiting for a connection..." << endl;
      sockConnected=accept(sockListen, (SOCKADDR*)&addr, &addrlen);
    
      send(sockConnected,linemode,strlen(linemode),0);
      send(sockConnected,echomode,strlen(echomode),0);
    
      rc = send(sockConnected,"Hallo, Linemode?! \0",6,0);
    
      cout << rc << " Bytes sent !" << endl;
    
          while(1)
          {
            rc = recv(sockConnected,recvBuf,RECV_BUF_MAXLEN,0);
            recvBuf[rc] = '\0';
            cout << rc << " Bytes angekommen: " << recvBuf << endl;
            cout << rc << " Bytes gesendet ." << endl;
          }
    }
    
    long WinsockStartup()
    {
      long rc;
    
      WORD wVersionRequested;
      WSADATA wsaData;
      wVersionRequested = MAKEWORD(2, 1);
    
      rc = WSAStartup( wVersionRequested, &wsaData );
      return rc;
    }
    


  • Hi !
    Dein Server funktioniert.
    Er funktioniert noch besser, wenn du die Endlosschleife in Zeile 56 rausnimmst.
    🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten