Как отправить команду с сервера и получить вывод от клиента - PullRequest
0 голосов
/ 19 января 2020
server.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>



int main(int argc, char *argv[]){
int portno;
        int sockfd, ret;
         struct sockaddr_in serverAddr;

        int newSocket;
        struct sockaddr_in newAddr;

        socklen_t addr_size;

        char buffer[1024];
        pid_t childpid;

        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sockfd < 0){
                printf("[-]Error in connection.\n");
                exit(1);
        }
        printf("[+]Server Socket is created.\n");
         portno = atoi(argv[1]);
        memset(&serverAddr, '\0', sizeof(serverAddr));
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(portno);
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

        ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
        if(ret < 0){
                printf("[-]Error in binding.\n");
                exit(1);
        }
        printf("[+]Bind to port %d\n", portno);

        if(listen(sockfd, 10) == 0){
                printf("[+]Listening....\n");
        }else{
                printf("[-]Error in binding.\n");
        }


        while(1){
                newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size);
                if(newSocket < 0){
                        exit(1);
    }
        printf("[+]Bind to port %d\n", portno);

        if(listen(sockfd, 10) == 0){
                printf("[+]Listening....\n");
        }else{
                printf("[-]Error in binding.\n");
        }


        while(1){
                newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size);
                if(newSocket < 0){
                        exit(1);
                }
                printf("Connection accepted from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));

                if((childpid = fork()) == 0){
                        close(sockfd);

                        while(1){
                                recv(newSocket, buffer, 1024, 0);
                                if(strcmp(buffer, "END") == 0){
                                        printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
                                        break;
                                }else{
                                        printf("Client: %s\n", buffer);
                                        send(newSocket, buffer, strlen(buffer), 0);
                                        bzero(buffer, sizeof(buffer));
                                }
                        }
                }

        }

        close(newSocket);


        return 0;
}


}
Client.c
      #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>



int main(int argc, char *argv[]){
int portno;
        int clientSocket, ret;
        struct sockaddr_in serverAddr;
        char buffer[1024];

        clientSocket = socket(AF_INET, SOCK_STREAM, 0);
        if(clientSocket < 0){
                printf("[-]Error in connection.\n");
                exit(1);
        }
        printf("[+]Client Socket is created.\n");
        portno = atoi(argv[2]);
        memset(&serverAddr, '\0', sizeof(serverAddr));
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(portno);
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

        ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
        if(ret < 0){
                printf("[-]Error in connection.\n");
                exit(1);
        }
        printf("[+]Connected to Server.\n");

        while(1){
                printf("Client: \t");
                scanf("%s", &buffer[0]);
                send(clientSocket, buffer, strlen(buffer), 0);

                if(strcmp(buffer, "END") == 0){
                        close(clientSocket);
                        printf("[-]Disconnected from server.\n");
                        exit(1);
                }

                if(recv(clientSocket, buffer, 1024, 0) < 0){
                        printf("[-]Error in receiving data.\n");
                }else{
                        printf("Server: \t%s\n", buffer);
                }
        }

        return 0;
}




И я хочу каждый раз, когда я запускаю сервер и клиент, когда я запускаю команду ls с сервера, получаю вывод от клиента и другие команды, такие как ls-l и ls -l | w c и ls> result.txt Я пытаюсь запустить много примеров, которые нашел, но ничего не получаю, просто запускаю команду с сервера и передаю тот же вывод моему клиенту

...