TCP Verbindung zu einem Telnet Dienst öffnen und Befehl abschicken



  • Hallo.

    Ich bin es mal wieder^^

    Habe mal wieder ein kleineres Problem.

    Ich öffne eine TCP Verbindung zu einem Telnet Daemon und will diesem einen Befehl senden. Nur habe ich keinen Plan wie ich das mache.

    Mein Code für das ganze sieht derzeit so aus:

    void Power_Switching()
    {
    
        int i,f,c;
    static TCP_t *t;
    static BYTE InBuf[512 + 8];
    static BYTE OutBuf[512 + 8];
    static BYTE target[4];            
    extern int ChanS2NoTel(TCP_t *t, int typ, int mode); 
    extern ChanRcv();   
    t=TCPAlloc();
    t->r.StCall=(ST_CALL)ChanS2NoTel;
    t->r.RcvCall=ChanRcv;
    t->RcvFifo=FifoInit(InBuf, 512);
    t->XmitFifo=FifoInit(OutBuf,512);
    t->a.Port=22;
    
      set_portpin_1(1);
      set_portpin_2(1);
      set_portpin_3(1);
    
      sdelay(100);
      set_portpin_1(0);
      set_portpin_2(0);
      set_portpin_3(0);
    
      BlinkRWord    = 0x0000;                        /* red LED: OFF */
      BlinkReset();
      printf("Starting Switching Routine");
      spawn(Antenna_Switching, MyClockStack, sizeof( MyClockStack ), -1, "MyAntenna");
      c=1;
      f=0;
    
      while(1)
    {
        printf("\rReboot Circle Nr. %d\r", c);
     set_portpin_1(1);
    
     for(i=0; i < Setup[Socket_Uptime]; i++)
     {
         sdelay(1000);
         //printf("%d s\r\n", i);
     }
    
    memcpy(target, Setup+ NTP_server_1_IP,4);
    memcpy(t->a.Ip,target,4);
    if (Setup[NTP_server_1_IP] != 0)
    {
    
    			sdelay(500);
    		         TCPOpen(1, t, 22);
    		        sdelay(100);
    
     if(t->State == ESTABLISHED)
     {
         //printf("\n\rThe Connection to the IP 1 has been established\n\r");
     }
     else
     {
         f++;
         printf("\n\rThe connection to IP 1 couldnt be opened on Reboot Circle %d. Error Count: %d\r", c, f);
         sprintf(mytext,"Connection to IP %A could not be established on Reboot Circle %d. Anzahl der Fehler %d",t->a.Ip, c, f);
         syslog(LOG_ALERT,mytext);
          kill((TCB *)MyErrorStack);
         spawn(Display_Error, MyErrorStack, sizeof( MyErrorStack ), -1, "MyError");
         nice();
    
     }
     T_Discon(t);
    }
     memcpy(target, Setup+ NTP_server_2_IP,4);
    memcpy(t->a.Ip,target,4);
    if (Setup[NTP_server_2_IP] != 0)
    {
     			sdelay(500);
    		         TCPOpen(1, t, 22);
    		        sdelay(100);
    
     if(t->State == ESTABLISHED)
     {
         //printf("\n\rThe Connection to the IP 2 has been established\n\r");
     }
     else
     {
         f++;
         printf("\n\rThe connection to IP 2 couldnt be opened on Reboot Circle %d. Error Count: %d\n\r", c, f);
         sprintf(mytext,"Connection to IP %A could not be established on Reboot Circle %d. Anzahl der Fehler %d",t->a.Ip, c, f);
         syslog(LOG_ALERT,mytext);
           kill((TCB *)MyErrorStack);
      spawn(Display_Error, MyErrorStack, sizeof( MyErrorStack ), -1, "MyError");
         nice();
    
     }
     T_Discon(t);
    }
     memcpy(target, Setup+ NTP_server_3_IP,4);
    memcpy(t->a.Ip,target,4);
    if (Setup[NTP_server_3_IP] != 0)
    {
     			sdelay(500);
    		         TCPOpen(1, t, 22);
    		        sdelay(100);
    
     if(t->State == ESTABLISHED)
     {
         //printf("\n\rThe Connection to IP 3 has been established\n\r");
     }
     else
     {
         f++;
         printf("\n\rThe connection to IP 3 couldnt be opened on Reboot Circle %d. Error Count: %d\n\r", c, f);
         sprintf(mytext,"Connection to IP %A could not be established on Reboot Circle %d. Anzahl der Fehler %d",t->a.Ip, c, f);
         syslog(LOG_ALERT,mytext);
         kill((TCB *)MyErrorStack);
         spawn(Display_Error, MyErrorStack, sizeof( MyErrorStack ), -1, "MyError");
         nice();
    
     }
     T_Discon(t);
    }
     set_portpin_1(0);
     for(i=0; i < Setup[Socket_Downtime]; i++)
     {
     sdelay(1000);
     }
     c++;
    }
    }
    

    Die Definition der Verbindung findet oben bei t->TCP Alloc(); statt.

    Geöffnet wird die Verbindung per TCPOpen();.

    Bitte nicht wundern. Das ganze wird auf einem Lantronix XPort ausgeführt und wird mit dem CPK dazu programmiert. Geht jetzt im wesentlichen um die Theorie^^

    Schon einmal danke.



  • Das Problem hat nichts mit C zu tun.
    Sollte glaub in das Unterforum Linux verschoben werden.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Also ganz ehrlich. Das Ding hat mehr mit c als mit Linux zu tun.

    Es ist die Programmiersprache c nur in ner ganz alten Version (Borland 5.02).

    Ansonsten ist das normale C Syntax.



  • Geht jetzt im wesentlichen um die Theorie

    http://beej.us/guide/bgnet/

    Ansonsten poste bitte eine Minimalbeispiel. D.h. Zugriff und Code fuer LEDs haben in diesem Minimalbeispiel nichts verloren. Auch solltest du eine konkrete Frage formulieren. "Wie mache ich das?" oder "Funktioniert nicht!" ist zu unspezifisch.



  • Evilmachine schrieb:

    Also ganz ehrlich. Das Ding hat mehr mit c als mit Linux zu tun.

    Nein, weil du das mit Standard-C nicht machen kannst, dafür brauchst du OS-spezifische APIs.

    Ansonsten – wie bereits gesagt: Poste bitte ein Minimalbeispiel und stelle eine konkrete Frage; niemand liest sich auf Verdacht einfach mal 130 Zeilen Sourcecode durch; noch dazu ohne zu wissen was überhaupt dein Problem ist.



  • Mein Problem ist das in Zeile 52 per TCPOpen(1, t, 22); eine TCP Verbindung geöffnet wird und ich keinen Plan habe wie ich die Befehle in diese Verbindung bekomme.

    Habe schon rausbekommen das ich das per FIFO machem muss

    strcpy(tcp_buf,"root");
                           IOCall(6,(BYTE *)&t->XmitFifo,tcp_buf,strlen(tcp_buf));
                            strcpy(tcp_buf,"timeserver");
                           IOCall(6,(BYTE *)&t->XmitFifo,tcp_buf,strlen(tcp_buf));
    l=IOCall(0,(BYTE *)&t->RcvFifo);    /* asks for character on TCP */
                if(l) {                               /* if characters available */
                 for(i=0;i<l;i++)
                  tcp_buf[i]=IOCall(1,(BYTE *)&t->RcvFifo);/* reads characters to buffer */
                 sendblk(tcp_buf,l);     /* and sends the buffer content to COM1 */
                }
    

    Allerdings bekomme ich dann über die Serielle Schnittstelle nur sowas angezeigt

    ÿýÿý ÿý#ÿý'



  • Also das absolute Minimum, was man an Lesbarkeit von Code erwarten kann ist, dass er korrekt eingerückt ist. Also mir vergeht die Lust, den Code genauer anzuschauen, wenn er so aussieht, wie hier.

    Das nächste wäre, den Code in sinnvolle Abschnitte aufzuteilen und möglicherweise einzelne Funktionen mit sprechenden Namen zu schreiben.

    Ansonsten ist hier ja schon gesagt worden, dass die Problembeschreibung unzureichend ist. Ich finde es interessant, wenn Du sagst, dass Du keinen Plan hast und dann über hundert Zeilen Code schreibst. Irgendeine Vorstellung scheinst Du ja zu haben.



  • niemand liest sich auf Verdacht einfach mal 130 Zeilen Sourcecode durch; noch dazu ohne zu wissen was überhaupt dein Problem ist.

    Der nicht einmal konsistent eingerückt ist. Wer so etwas schreibt, hat also schon mal ein ganz grundlegendes Problem.

    Aber Borland 5.02 klingt nicht nach Linux/Unix. (Wer kramt heutzutage überhaupt noch so einen alten Compiler aus? Der ist doch 15 Jahre alt...) Ich verschieb es mal ins rudpf Forum.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Ja Rüdiger. ich hab mir das auch nicht ausgesucht xD

    Das Problem ist das ich eine Firmware für einen Lantronix XPort schreibe und der Compiler 16Bit CPUs unterstützen muss. Uns das kann wohl nur der^^

    Der Xport ist quasi eine Netzwerkbuchse mit integriertem OS und ist in meinem Fall auf eine Steckdose gelötet, mit der wir Reboot Stress Test fahren wollen.

    Mehr infos zu dem Teil unter http://www.lantronix.com/device-networking/embedded-device-servers/xport.html

    Ich würde auch gerne richtiges C machen, aber diese Kiste funktioniert halt nur mit nem speziellen SDK vom Hersteller.

    Und da ist das zwar auch C (hat mir nen Kollege zumindest versucht weiß zu machen) Nur halt mit ner sehr alten Syntax.



  • Sorry, das mit Borland habe ich überlesen.

    Trotzdem: Bastel doch mal ein komplettes Minimalbeispiel, wo du versuchst, "Hello world" zu versenden oä.

    Die Syntax ist übrigens ganz stinknormales C, aber die diversen Libraries sind trotzdem kein Standard-C, ergo ist das ANSI-C-Forum nicht geeignet.



  • Evilmachine schrieb:

    Allerdings bekomme ich dann über die Serielle Schnittstelle nur sowas angezeigt

    ÿýÿý ÿý#ÿý'

    Das sieht fast nach falscher Baudrate aus.

    Und Borlad-C 5 ist richtiges C. Ist halt ein 16-Bit Compiler.
    Dein Problem liegt beim Verständnis der API.


Anmelden zum Antworten