SeCa
17-07-2003, 13:44
Hallo leute,
ich hab ein kleines Problem.
Wenn ich in der Konsole
telnet localhost
eingebe, kommt schön die auforderung nach dem login. Und die Verbindung bleibt offen.
Wenn ich nun allerdings die Standardeingabe vom telnet-client über eine pipe zu meinem programm leite, und dann in die pipe "open localhost" schreibe, bleibt die Verbindung nicht offen sondern wird gleich wider geschlossen. Wisst ihr wie ich die verbindung offen behalten kann?
Hier noch mein Code:
#include <math.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(char argc, char *argv[]){
long von,bis,i,teiler,zahl,wurzel;
int fd_to_child[2],fd_from_child[2];
pid_t pid;
FILE *schreib_dz;
if(pipe(fd_to_child) < 0 ){
printf("Kann keine Pipe einrichten\n");
exit(0);
}
if(pipe(fd_from_child) < 0){
printf("Kann keine Pipe einrichten\n");
exit(0);
}
if((pid = fork()) < 0){
printf("Konnte aus mir nicht noch eins machen :-( (fork)\n");
exit(0);
}
//******** Elternprozess *********
else if(pid > 0){
close(fd_to_child[0]);
close(fd_from_child[1]);
if(( schreib_dz = fdopen(fd_to_child[1], "w")) == NULL){
printf("fdopen-Fehler\n");
exit(0);
}
//for(i =0; i<=10000; i++){
// fprintf(schreib_dz,"\n %i",i);
//}
fprintf(schreib_dz,"open localhost");
//fprintf(schreib_dz,"NICK sebi\n");
//fprintf(schreib_dz,"USER sebi bsei bsieb sie\n");
fclose(schreib_dz);
if(waitpid(pid, NULL, 0) < 0){
printf("Waitpid-Fehler\n");
exit(0);
}
exit(0);
}
//******** Kindprozess ********
else {
close(fd_to_child[1]);
close(fd_from_child[0]);
if(fd_to_child[0] != STDIN_FILENO){
if(dup2(fd_to_child[0], STDIN_FILENO) != STDIN_FILENO){
printf("Fehler bei dup2 fuer stdin\n");
exit(0);
}
close(fd_to_child[0]);
}
//if(fd_from_child[1] != STDOUT_FILENO){
// if(dup2(fd_from_child[1], STDOUT_FILENO) != STDOUT_FILENO){
// printf("Fehler bei dup2 fuer stdout\n");
// exit(0);
// }
// close(fd_from_child[1]);
//}
if(execl("/usr/bin/telnet","TELNET-CLIENT",NULL) <0){
printf("Fehler bei execl-Aufruf für TELNET\n");
exit(0);
}
}
}
Achja ... sollte ich irgendwo standard falsch geschrieben haben ist mir das egal ;)
Grüsse SeCa
ich hab ein kleines Problem.
Wenn ich in der Konsole
telnet localhost
eingebe, kommt schön die auforderung nach dem login. Und die Verbindung bleibt offen.
Wenn ich nun allerdings die Standardeingabe vom telnet-client über eine pipe zu meinem programm leite, und dann in die pipe "open localhost" schreibe, bleibt die Verbindung nicht offen sondern wird gleich wider geschlossen. Wisst ihr wie ich die verbindung offen behalten kann?
Hier noch mein Code:
#include <math.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(char argc, char *argv[]){
long von,bis,i,teiler,zahl,wurzel;
int fd_to_child[2],fd_from_child[2];
pid_t pid;
FILE *schreib_dz;
if(pipe(fd_to_child) < 0 ){
printf("Kann keine Pipe einrichten\n");
exit(0);
}
if(pipe(fd_from_child) < 0){
printf("Kann keine Pipe einrichten\n");
exit(0);
}
if((pid = fork()) < 0){
printf("Konnte aus mir nicht noch eins machen :-( (fork)\n");
exit(0);
}
//******** Elternprozess *********
else if(pid > 0){
close(fd_to_child[0]);
close(fd_from_child[1]);
if(( schreib_dz = fdopen(fd_to_child[1], "w")) == NULL){
printf("fdopen-Fehler\n");
exit(0);
}
//for(i =0; i<=10000; i++){
// fprintf(schreib_dz,"\n %i",i);
//}
fprintf(schreib_dz,"open localhost");
//fprintf(schreib_dz,"NICK sebi\n");
//fprintf(schreib_dz,"USER sebi bsei bsieb sie\n");
fclose(schreib_dz);
if(waitpid(pid, NULL, 0) < 0){
printf("Waitpid-Fehler\n");
exit(0);
}
exit(0);
}
//******** Kindprozess ********
else {
close(fd_to_child[1]);
close(fd_from_child[0]);
if(fd_to_child[0] != STDIN_FILENO){
if(dup2(fd_to_child[0], STDIN_FILENO) != STDIN_FILENO){
printf("Fehler bei dup2 fuer stdin\n");
exit(0);
}
close(fd_to_child[0]);
}
//if(fd_from_child[1] != STDOUT_FILENO){
// if(dup2(fd_from_child[1], STDOUT_FILENO) != STDOUT_FILENO){
// printf("Fehler bei dup2 fuer stdout\n");
// exit(0);
// }
// close(fd_from_child[1]);
//}
if(execl("/usr/bin/telnet","TELNET-CLIENT",NULL) <0){
printf("Fehler bei execl-Aufruf für TELNET\n");
exit(0);
}
}
}
Achja ... sollte ich irgendwo standard falsch geschrieben haben ist mir das egal ;)
Grüsse SeCa