Как Linux обрабатывает несколько сокетов, привязанных к одному порту с помощью INADDR_ANY и определенным IP-адресом?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Как Linux обрабатывает несколько сокетов, привязанных к одному порту с помощью INADDR_ANY и определенным IP-адресом?

Сообщение Anonymous »

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

Код: Выделить всё

int sock1 = socket(AF_INET, SOCK_STREAM, 0);
int sock2 = socket(AF_INET, SOCK_STREAM, 0);

int optval = 1;
setsockopt(sock1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
setsockopt(sock2, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

// Socket 1: Bind to INADDR_ANY (all interfaces)
struct sockaddr_in addr1;
addr1.sin_family = AF_INET;
addr1.sin_addr.s_addr = htonl(INADDR_ANY);
addr1.sin_port = htons(80);
bind(sock1, (struct sockaddr*)&addr1, sizeof(addr1));

// Socket 2: Bind to specific IP address
struct sockaddr_in addr2;
addr2.sin_family = AF_INET;
addr2.sin_addr.s_addr = inet_addr("66.117.236.114");
addr2.sin_port = htons(80);
bind(sock2, (struct sockaddr*)&addr2, sizeof(addr2));
Что я уже узнал:
  • Сокет, привязанный к INADDR_ANY, прослушивает все доступные IP-адреса, в то время как другой сокет прослушивает только 66.117.236.114.
  • Опция SO_REUSEADDR позволяет обоим сокетам привязываться к одному и тому же порту без ошибок, но насколько насколько я понимаю, он не контролирует, какой сокет обрабатывает входящие соединения.
Мои ключевые вопросы:
[*]Есть ли сценарий, при котором соединение с адресом 66.117.236.114:80 может обрабатываться сокетом INADDR_ANY?
[*]Какую роль здесь играет SO_REUSEADDR? Влияет ли это на то, какой сокет обрабатывает входящие соединения, или это актуально только во время процесса привязки?

Желаемое поведение:
Я хочу, чтобы любые соединения, нацеленные на 66.117.236.114:80, всегда обрабатывались вторым сокетом (тот, который явно привязан к этому адресу), а соединения с другими IP-адресами (например, 127.0.0.1:80) обрабатываются сокетом INADDR_ANY.
Любые разъяснения или Будем очень признательны за подтверждение того, как Linux справляется с этим!

Подробнее здесь: https://stackoverflow.com/questions/791 ... inaddr-any
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»