Подключение Linux-клиента к MacOS-серверу с помощью C - PullRequest
0 голосов
/ 25 декабря 2018

Я изучаю сокеты и пытаюсь написать очень простое приложение.Клиент отправляет строку «Hello there!», Сервер принимает ее, отображает у себя и отправляет обратно.Написал клиент (Linux Ubuntu 18.04) и сервер (macOS 10.14.2, IP: 217.144.173.149): сервер:

int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1);

    while(1)
    {
        sock = accept(listener, 0, 0);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }

        while(1)
        {
            bytes_read = recv(sock, buf, 1024, 0);
            if (bytes_read <= 0) break;
            printf(buf);
            send(sock, buf, bytes_read, 0);
        }

        close(sock);
    }

    return 0;
}

клиент:

int main()
{
    char message[] = "Hello there!\n";
    char buf[sizeof(message)];

    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = inet_addr("217.144.173.149");
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        exit(2);
    }

    send(sock, message, sizeof(message), 0);
    recv(sock, buf, sizeof(message), 0);

    printf(buf);
    close(sock);

    return 0;
}

Однако послепри запуске клиента он просто зависает и через некоторое время выдает ошибку: connect: Время соединения истекло.Сервер при этом, конечно, работает.Поиск в Google не дал результатов (возможно, я искал).Что я не так сделал?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Проблема заключается в способе преобразования IP-адреса из типа презентации в тип сети.

  1. Вы должны использовать IP-адрес, если он статический, а не INADDR_ANY.
  2. Если проблема остается, попробуйте использовать другую функцию для преобразования IP-адреса.

Для получения дополнительной информации перейдите по ссылке здесь .

0 голосов
/ 25 декабря 2018

Как и предлагалось в других ответах, проверьте, правильно ли ваш сервер прослушивает команду netstat на сервере

. На сервере проверьте, работает ли firewalld или какое-либо другое программное обеспечение, специфичное для firewall. Попробуйте использовать другой порт для привязки на сервере,может быть 8080 или что-то еще.

Я также предлагаю вам прочитать превосходное руководство (руководство по сетевому программированию beejs) https://beej.us/guide/bgnet/

0 голосов
/ 25 декабря 2018
  1. Проверьте IP-брандмауэр сервера ipfw.(Откройте порт 3425, который прослушивает порт сервера)
  2. IP-адрес сервера должен быть общедоступным.Или сервер и клиент в одной локальной сети.

Если вы просто хотите проверить свой код.Вы можете запустить сервер и клиент на одном компьютере.Откройте два терминала и один запустите сервер, другой запустите клиент.И клиент меняет ip соединения 217.144.173.149 на 127.0.0.1 127.0.0.1 означает localhost.

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