Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > socket no 127.0.0.1


Автор: YahоО 19.6.2021, 12:18
Код

int main()
{
    WSADATA wsaData; // служебная структура для хранение информации о реализации Windows Sockets старт использования библиотеки сокетов процессом (подгружается Ws2_32.dll)
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);    
    if (result != 0) {      // Если произошла ошибка подгрузки библиотеки
        cerr << "WSAStartup failed: " << result << "\n";
        system("pause");
        return result;
    }
    struct addrinfo* addr = NULL; // структура, хранящая информацию об IP-адресе  слущающего сокета    
    struct addrinfo hints;              // Шаблон для инициализации структуры адреса
    ZeroMemory(&hints, sizeof(hints));

    hints.ai_family = AF_INET;               // AF_INET определяет, что будет использоваться сеть для работы с сокетом
    hints.ai_socktype = SOCK_STREAM; // Задаем потоковый тип сокета
    hints.ai_protocol = IPPROTO_TCP;    // Используем протокол TCP
    hints.ai_flags = AI_PASSIVE;            // Сокет будет биндиться на адрес, чтобы принимать входящие соединения

    // Инициализируем структуру, хранящую адрес сокета - addr    
    result = getaddrinfo("127.0.0.1", "8000", &hints, &addr);  // Наш HTTP-сервер будет висеть на 8000-м порту локалхоста

    if (result != 0) { // Если инициализация структуры адреса завершилась с ошибкой, выведем сообщением об этом и завершим выполнение программы
        cerr << "getaddrinfo failed: " << result << "\n";
        WSACleanup();  // выгрузка библиотеки Ws2_32.dll
        return 1;
    }
    // Создание сокета
    int listen_socket = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
    ...

Вопрос про адрес при создании (инициализации) серверного сокета, если указывать не "127.0.0.1" локалхоста, то какой адрес можно указывать?

Порт, с портом понятно, какой указать такой и будет, но с адресом и его возможными значениями не понятно.

Что вообще означает адрес - мы что можем указать произвольный адрес какого то удаленного и даже очень удаленного сервера в интернете? это разве допустимо? 
У конкретного адреса в интернете вполне может быть свой серверный сокет на таком же порту, и накладки быть не может, а если там порт до сих пор не задействован то значит как бы можно?
А если чужой порт указывать все же нельзя, то зачем указывать его вообще, т.е. он всегда будет своим собственным, так для сервера локалхоста это 127.0.0.1, а для сервера в интернете это его конкретный присвоенный ему айпи.

И тут дополнительный вопрос - если домашний пк в сети, тем самым у него уже есть айпи, то запустив короткую программу со своим слушающим сервером к нему уже может прислать запрос иногородний сайт?

Автор: Oldshelf 19.6.2021, 18:14
Плохо разбираюсь в этом вопросе, но выскажу предположение.

Допустим, программа запущена на удалённом сервере, у которого есть внешний ip. Тогда при указании "127.0.0.1" она будет слушать внутренние запросы сервера (например, обращения от фронт-энд веб-сервера), а при указании внешнего ip - все запросы, поступающие извне (например, от пользователей, зашедших на сайт).

Чужой адрес слушать вряд ли получится. Запросы не будут поступать на сторонний сервер, какой бы адрес он ни слушал.

Автор: YahоО 21.6.2021, 19:02
127.0.0.1 адрес пк «localhost» специальный сетевой интерфейс «внутренней петли», с ним можно "договориться" с помощью С++, в данном случае он не интересен.
Но у пк в сети есть внешний адрес, и у С++ есть возможность при создании сокета указать адрес не обязательно 127.0.0.1 «localhost», 
и пожалуй не обязательно свой внешний адрес, и вопрос мой как раз и касается этого момента.

Проверить экспериментом свое предположение не могу, пока что мучаю пхпсокеты и похоже что мой фрихостер не позволяет продвинуться дальше чем:

Произошла ошибка: undefined, (Unknown)
Соединение с сервером закрыто
Обрыв соединения
Код: 1006

Поэтому и с сайта прислать запрос на свой пк естественно нет никакой возможности, и тем более указать в пк адрес сервера,
да к тому же по всей видимости для проверки потребуется еще какой то дополнительный "независимый" сайт-сервер.


Автор: _zorn_ 9.7.2021, 13:49
Цитата(YahоО @  19.6.2021,  19:18 Найти цитируемый пост)
если указывать не "127.0.0.1" локалхоста, то какой адрес можно указывать?

0.0.0.0 - слушать все сетевые интерфейсы в системе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)