Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  12345
Language: C/C++
Code:
#include <sys/neutrino.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>

typedef struct ServerInfo {
    int pid;
    int channel;
} ServerInfo;

ServerInfo GetServerInfo() {
    ServerInfo res;
    FILE *stream_id = fopen("ID.txt", "r");
    if(stream_id != NULL) {
        fscanf(stream_id, "%d %d", &res.pid, &res.channel);
        fclose(stream_id);
    }
    else {
        puts("Can't get info of server automatically.\nEnter manually(pid chanel): ");
        scanf("%d %d", &res.pid, &res.channel);
        getc(stdin); // съедает \n после чисел
    }

    return res;
}

int ConnectToServer(ServerInfo info) {
     /*
      int ConnectAttach(int nd, pid_t pid, int chid, unsigned index, int flags);
      nd - Node Descriptor (0 - local)
      pid - procces ID (server)
      chid - chanel ID (channel from server)
      index - the lowest acceptable connection ID
      flags - if flags contains _NTO_COF_CLOEXEC, the connection is closed when your process calls an exec*() function to start a new process
     */
    int connectId = ConnectAttach(0, info.pid, info.channel, 0, 0);
    if (connectId == -1) {
        perror("Error Connect Attach: ");
        exit(EXIT_FAILURE);
    }

    return connectId;
}

#define SIZE_BUFFER 1024

bool IsStop(const char* input) {
    return strcmp(input, "stop") == 0;
}

// delete \n after enter
char *myfgets(char *str, int num, FILE * filestream) {
    char *res = fgets(str, num, filestream);
     // replace \n -> \0  
    if( res != NULL ){
        res[strlen(res)-1] = '\0';
    }
    return res;
}

// RetValue - всё норм?
bool UserWork(int connectId) {
    char userInput[SIZE_BUFFER] = {};
    puts("Input your command: ");

    if( myfgets(userInput, SIZE_BUFFER, stdin) == NULL ) {
        puts("No input...");
        return true; // нет ввода - всё норм
    }
    if( IsStop(userInput) ) {
        return false;
    }

    char serverAnswer[SIZE_BUFFER];
     /*
      int MsgSend(int coid, const void *smsg, int sbytes, void *rmsg, int rbytes);
      coid - connection identifier with target server
      smsg - pointer to the transmitted message
      sbytes - the size of the transmitted message
      rmsg - pointer to buffer for response message
      rbytes - the size of the response message
     */
    if( MsgSend(connectId, userInput, strlen(userInput) + 1, serverAnswer, SIZE_BUFFER) == -1) {
        perror("Error send msg: ");
        exit(EXIT_FAILURE);
    }

    printf("Server answer: \n------\n%s\n------\n", serverAnswer);
    return true;
}


int main(void) {

    puts("Client started!");

    ServerInfo info = GetServerInfo();
    printf("Selected server pid: %d, channel: %d\n", info.pid, info.channel);

    int connectId = ConnectToServer(info);
    printf("Connected to server! id connect: %d\n", connectId);

    while(UserWork(connectId));

    puts("Bye!");
     ConnectDetach(connectId);

     return 0;
}
Comments: