Сокет-сервер, работающий по определенному адресу сетевого интерфейса - PullRequest
0 голосов
/ 22 января 2019

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

int server(int port)
{
    int fd;
    struct ifreq ifr;
    char * addres;
    fd = socket(AF_INET, SOCK_STREAM, 0);

    /* I want to get an IPv4 IP address */
    ifr.ifr_addr.sa_family = AF_INET;

    /* I want IP address attached to "eth0" */
    strncpy(ifr.ifr_name, "em0", IFNAMSIZ-1);

    ioctl(fd, SIOCGIFADDR, &ifr);

    close(fd);
    addres=inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);

    //until this part, i'm getting my em0 address to a variable which I want to use later
    //to specify on which address I want my server to be

    int s, s2, t, len;
    int z;
    struct sockaddr_in local, remote;
    char str[100];

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = inet_addr(addres);          //inet_addr(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
    printf("binder");
    if (bind(s, (struct sockaddr *)&local, sizeof(local)) == -1) {
        perror("bind");
        exit(1);
    }
    if (listen(s, 5) == -1) {
        perror("listen");
        exit(1);
    }

    for(;;) {
        int done, n;
        printf("Waiting for a connection...\n");
        t = sizeof(remote);
        if ((s2 = accept(s, (struct sockaddr *) &remote, (socklen_t *) &t)) == -1) {
            perror("accept");
            exit(1);
        }
        printf("Connected...\n");
        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;
}

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

./main.o -l [port]

и для запуска клиента я бы хотел использовать:

./main.o [address] [port]

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

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