2 Stimmen

Lesen Sie aus dem Telnet-Socket in C

Ich möchte die Modemliste aus dem CMTS abrufen und habe einen Telnet-Client in C geschrieben, der dies ausführt. Das Problem ist, dass ich manchmal nicht alle Daten vom CMTS bekomme. (Wenn ich die 'Verzögerung' reduziere, bekomme ich weniger Daten.)

char buf[50000];
int nbytes, sock;
struct sockaddr_in cmts;

cmts.sin_family      = AF_INET;
cmts.sin_port        = htons( 23 );
cmts.sin_addr.s_addr = inet_addr("192.168.1.1");

sock = socket( PF_INET, SOCK_STREAM, 0 );

if ( sock < 0 ) {
    perror("Fehler beim Erstellen des Sockets!");
    exit (EXIT_FAILURE);
}

if ( connect( sock, (struct sockaddr *) &cmts, sizeof( cmts ) ) < 0 ) {
    perror("Fehler beim Verbindungsprozess!");
    exit (EXIT_FAILURE);
}

write( sock, "testuser\n", 9 );
write( sock, "testenapwd\n", 11 );
write( sock, "terminal length 0\n", 18 );
usleep( 100000 );
read( sock, buf, sizeof( buf ) );
usleep( 100000 );
write( sock, "show cable modem\n", 17 );
usleep( 100000 );

while ( 1 ) {
    nbytes = 0;
    ioctl( sock, FIONREAD, &nbytes );

    if ( !nbytes ) { break; }
    else {
        memset( buf, 0, sizeof( buf ) );
        nbytes = read( sock, buf, sizeof( buf ) -1 );
        printf("%s", buf);
        printf(">>>%d<<<\n", nbytes);  // für Debugging-Zwecke
    }

    usleep( 300000 );   // Verzögerung
}

close( sock );
exit (EXIT_SUCCESS);

1voto

Abdellah IDRISSI Punkte 531

Schau dir diesen Beej's Leitfaden zum Netzwerkprogrammierung an

Es wird empfohlen, die recv- und send-Funktionen bei Netzwerkanwendungen zu verwenden.

recv gibt die Anzahl der empfangenen Bytes zurück oder -1, wenn ein Fehler auftritt. Der Rückgabewert beträgt 0, wenn der entfernte Host einen ordnungsgemäßen Abbruch durchgeführt hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X