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

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

Сообщение Anonymous »

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

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

// Test Program //

#include 
#include 
#include 
#include 
#include 

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

int optval = 1;
setsockopt(sock1, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
setsockopt(sock2, SOL_SOCKET, SO_REUSEPORT, &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);
if (bind(sock1, (struct sockaddr*)&addr1, sizeof(addr1)) < 0) {
perror("bind failed for sock1");
exit(1);
}

// Socket 2: Bind to specific IP address
struct sockaddr_in addr2;
addr2.sin_family = AF_INET;
addr2.sin_addr.s_addr = inet_addr("192.168.1.4");
addr2.sin_port = htons(80);
if (bind(sock2, (struct sockaddr*)&addr2, sizeof(addr2)) < 0) {
perror("bind failed for sock2");
exit(1);
}

int rval1 = listen(sock1, 5);
if (rval1 == -1) {
perror("listen failed for sock1");
exit(1);
}

int rval2 = listen(sock2, 5);
if (rval2 == -1) {
perror("listen failed for sock2");
exit(1);
}

printf("%s\n", "Exiting test program");
}
Что я уже узнал:
  • Сокет, привязанный к INADDR_ANY, прослушивает все доступные IP-адреса, в то время как другой сокет прослушивает только 192.168.1.4.
  • Опция SO_REUSEPORT позволяет обоим сокетам привязываться к одному и тому же порту без ошибок, но насколько насколько я понимаю, он не контролирует, какой сокет обрабатывает входящие соединения.
Мои ключевые вопросы:
[*]Есть ли сценарий, при котором соединение с адресом 192.168.1.4:80 может обрабатываться сокетом INADDR_ANY?
[*]Какую роль здесь играет SO_REUSEPORT? Влияет ли это на то, какой сокет обрабатывает входящие соединения, или это актуально только во время процесса привязки?

Желаемое поведение:
Я хочу, чтобы любые соединения, нацеленные на 192.168.1.4: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»