Сервер принимает сообщения, но не команды в C - PullRequest
0 голосов
/ 23 января 2020

Я сейчас пытаюсь создать программу, которую вы можете подключить из любого места через inte rnet, используя сокеты. Я, очевидно, хочу выполнить команды и отобразить вывод клиенту, но также хочу вернуть все, что набрал клиент, и, если оно было получено, отобразить сообщение , полученное . Моя проблема в том, что, хотя он отображает то, что было отправлено, он не выполняет команды. Я попытался использовать GDB со строками разрыва в то время как l oop, но они не работают, как если время l oop никогда не выполняется.

Сервер:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
void error(const char *msg)
{
    perror(msg);
    exit(1);
}
int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno, pid;
    socklen_t clilen;
    char buffer[256];
    char* comm[20],*cbuff;
    struct sockaddr_in serv_addr, cli_addr;
    int n,i;
    char str[INET_ADDRSTRLEN];
    char* args;

    if (argc < 2)
    {
        fprintf(stderr, "No port provided\n");
        exit(1);
    }
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    memset((char *) &serv_addr, 0, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
    if (bind(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("ERROR on binding");

    for(;;){
        listen(sockfd, 5);
        clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0)
            error("ERROR on accept");
        if (inet_ntop(AF_INET, &cli_addr.sin_addr, str, INET_ADDRSTRLEN) == NULL) {
            fprintf(stderr, "Could not convert byte to address\n");
            exit(1);
        }
        fprintf(stdout, "The client address is :%s\n", str);
        while(1){
            bzero(buffer, 256);
            n = read(newsockfd, buffer, 255);
            if (n < 0) error("ERROR reading from socket");
            if(buffer=="exit"){
                printf("Exiting...\n");
                break;
            }

            cbuff=strtok(buffer," ");
            i=0;
            while(cbuff!=NULL){
                cbuff=strtok(NULL," ");
                comm[i]=cbuff;
                i++;
            }
            if ((pid=fork())==-1){
                perror("fork");
            }
            if(pid!=0){
                wait(NULL);
            }
            else{
                dup2(newsockfd,1);
                printf("executing...\n");
                execvp(comm[0],comm);
                perror("execvp");
                exit(EXIT_FAILURE);
            }

            printf("Here is the message: %s\n", buffer);
            n = write(newsockfd, "message received", 17);
            if (n < 0) error("ERROR writing to socket");
        }
        break;

    }
    close(newsockfd);
    close(sockfd);
    return 0;
}

Клиент:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg){
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[]){
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256];
    if (argc < 3){
        fprintf(stderr, "usage %s hostname port\n", argv[0]);
        exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL){
        fprintf(stderr, "ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
          (char *)&serv_addr.sin_addr.s_addr,server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");
    do{
        printf("Please enter the message: ");

        bzero(buffer, 256);
        fgets(buffer, 255, stdin);
        if(buffer=="exit"){
            printf("Exiting...\n");
            break;
        }
        n = write(sockfd, buffer, strlen(buffer));
        if (n < 0)
            error("ERROR writing to socket");
        bzero(buffer, 256);
        n = read(sockfd, buffer, 255);
        if (n < 0)
            error("ERROR reading from socket");
        printf("%s\n", buffer);
    }while(1);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...