Клиент-сервер Te lnet in C, проблема с трубами - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно написать простое приложение te lnet на языке C с использованием сокетов TCP. Что я сделал, так это клиент и сервер, который работает с такими командами, как 'ls' или 'pwd', но мне нужна возможность использовать различные программы оболочки, такие как bash, sh, csh. Может кто-нибудь сказать мне, какие функции я должен использовать или как восстановить свой сервер? Потому что теперь, когда я использую команду "sh", сервер и клиент платят.

На самом деле у меня есть эта функция внутри клиента:

void chat(int sockfd){
    char buff[MAX]; 
    char text[MAX];
    int n; 
    for (;;) { 
        bzero(buff, sizeof(buff)); 
        printf("->: "); 
        n = 0; 
        while ((buff[n++] = getchar()) != '\n') 
            ; 
        write(sockfd, buff, sizeof(buff)); 
        if ((strncmp(buff, "exit", 4)) == 0) { 
            printf("Exiting...\n"); 
            break; 
        } 
        bzero(buff, sizeof(buff)); 
        read(sockfd, tex, sizeof(tex));
        printf("Server message ->: %s", tex);
        bzero(tex, MAX);
    } 
}

А эта внутри сервера:

void chat(int sockfd){
        char buff[MAX];
        int n,p[1];
        FILE *fp;
        char path[1024];

        for(;;){
            bzero(buff, MAX);
            read(sockfd, buff, sizeof(buff));
            fp = popen(buff, "r");
            if(fp == NULL){
                strncpy(buff, "Failed to run command", MAX);
                write(sockfd, buff, sizeof(buff));
                continue;
            }
            printf("%s\n", buff);
            while(fgets(path, sizeof(path), fp) != NULL){
                write(sockfd, path, sizeof(path));
            }
            pclose(fp);
        }
    }

Спасибо за внимание.

...