Программирование сокетов с использованием IP-адресов - PullRequest
0 голосов
/ 22 января 2019

У меня есть простая клиентская программа tcp.Клиент отправляет текст, сервер печатает его в терминале.Мне нужно сделать так, чтобы клиент мог подключаться к серверу по IP-адресу, а не просто через порт (сейчас он у меня на localhost).Как я могу это сделать?Перепробовал много вещей, получая ошибки каждый раз.
Вот код клиента:

int client(char * add)  //add is an address passed, either hostname (for ex. google.com) 
{                       //or just a normal dotted ip (1.2.3.4)
    int s, t, len;
    struct sockaddr_un remote;
    char str[100];

    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    printf("Trying to connect...\n");

    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path, SOCK_PATH);
    len = strlen(remote.sun_path) + sizeof(remote.sun_family);
    if (connect(s, (struct sockaddr *)&remote, len) == -1) {
        perror("connect");
        exit(1);
    }

    printf("Connected.\n");
    int i=0;
    while(fgets(str, 100, stdin)) {
        if (send(s, str, strlen(str), 0) == -1) {
            perror("send");
            exit(1);
        }

    }

    close(s);
    return 0;
}


И есть сервер:

int server(void)
{
    int s, s2, t, len;
    int z;
    struct sockaddr_un local, remote;
    char str[100];

    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, SOCK_PATH);
    unlink(local.sun_path);
    len = strlen(local.sun_path) + sizeof(local.sun_family);
    if (bind(s, (struct sockaddr *)&local, len) == -1) {
        perror("bind");
        exit(1);
    }

    if (listen(s, 5) == -1) {
        perror("listen");
        exit(1);
    }

    for(;;) {
        int done, n;
        t = sizeof(remote);
        if ((s2 = accept(s, (struct sockaddr *) &remote, (socklen_t *) &t)) == -1) {
            perror("accept");
            exit(1);
        }
        done = 0;
        do {
            n = recv(s2, str, 100, 0);
            if (n <= 0) {
                if (n < 0) perror("recv");
                done = 1;
            }


            if (!done) 
                printf("%s", str);
                fflush(stdout);
                sleep(1);
        } while (!done);

        close(s2);
    }
    return 0;
}


Могу ли я подключить мой клиент к этому серверу, используя IP-адрес?
Моя функция драйвера выбирает, хочу ли я запустить сервер или клиента, все это в одном файле.
Для запуска сервера я использую:

./main.o -l [port]

и для запуска клиента I 'Я хочу использовать:

./main.o [address] [port]

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

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