как распечатать системный (командный) вывод в файл C? - PullRequest
0 голосов
/ 11 сентября 2018

Я изучаю сетевое программирование на Си.

сейчас я пытаюсь распечатать вывод команд, поступающих от клиента, в файл в папке сервера.

Код сервера:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

int read_size;
char Message[1024]="Hello client , I'm the Server";

int check(char *msg){return !strcmp(msg,"exit");}

int main(){
    //creat socket
    int soc;
    soc = socket(AF_INET, SOCK_STREAM, 0);

    //define server address
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = INADDR_ANY;

    //bind the socket to ip and port
    bind(soc, (struct sockaddr*) &server_address, sizeof(server_address));

    listen(soc, 5);

    puts("Listening...");

    int client_soc;
    client_soc = accept(soc, 0, 0);
    //send the message
    send(client_soc, Message, sizeof(Message), 0);
    if(client_soc<0){
        puts("Connection Error");
        return 0;
    }   
    puts("Connected");

    //Receive a message from client
    while(1){
        char response[1024]="";
        recv(client_soc,response, 1024, 0);
        //fflush(stdout);

        if(check(response)){
                        puts("Disconnected !");
                        break;
                }

        strcat(response," > out.txt");
        int sys = system(response);

        if(sys != 0)//worng command enterd
            printf("Worng Command");


    }
    //close the sockets
    close(client_soc);
    close(soc);
    return 0;
}

Код клиента:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

char response[1024];
char Message[1024];

int check(char *msg){
        return !strcmp(msg,"exit");
}
int main(){
        //creat a socket
        int soc;
        soc = socket(AF_INET, SOCK_STREAM, 0);

    //specify an address for the socket
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9002);
    server_address.sin_addr.s_addr = INADDR_ANY;
    int con = connect(soc , (struct sockaddr *) &server_address , sizeof(server_address));

    //check for error with the connection
    if(con == -1){
        puts("Connection Error !");
        close(soc);
        exit(0);
    }

    //recieve data from the server
    recv(soc, &response, sizeof(response), 0);

    //print recieved data
    printf("Server : %s\n",response);   

    //Send message to server
    //send(soc, Message, strlen(Message), 0);
    while(1){
        printf("Message For The Server : ");
        //scanf("%s",Message);
        gets(Message);
        send(soc, Message, strlen(Message), 0);
        //fflush(stdout);
        if(check(Message)){
            puts("Disconnected !");
            break;
        }
    }
    //close the socket
    close(soc);
        return 0;

}

Теперь проблема:

когда я отправляю действительную команду (от клиента), сервер без проблем распечатает результат в файле, но когда я отправлю неверную команду, он очистит файл и напечатает вывод в терминале.

можно ли вывести в файл неправильное сообщение от "system ()" вместо терминала?

1 Ответ

0 голосов
/ 12 сентября 2018

Вывод команды и ее сообщения об ошибках / состоянии четко разделены, поэтому вам не нужно беспокоиться о сообщениях об ошибках, искажающих ожидаемый вывод программы.

1> aka > только перенаправляет вывод, в то время как 2> только перенаправляет ошибки:

$ ls -l myfile filethatdoesntexist > output 2> errors

$ cat output
-rw-r--r-- 1 me me 42 Sep 11 14:08 myfile

$ cat errors
ls: cannot access 'filethatdoesntexist': No such file or directory

Если вы хотите записать оба в один и тот же файл, использовать конструкцию оболочки> file 2>&1

$ ls -l myfile filethatdoesntexist > out.txt 2>&1

$ cat out.txt
ls: cannot access 'filethatdoesntexist': No such file or directory
-rw-r--r-- 1 me me 42 Sep 11 14:08 myfile

Таким образом, вы можете изменить свой суффикс на:

strcat(response," > out.txt 2>&1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...