Я разрабатываю серверное приложение в 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 справляется с этим!
Я разрабатываю серверное приложение в Linux, и у меня возник вопрос о поведении привязки сокетов при использовании INADDR_ANY и определенных IP-адресов. Моя тестовая установка включает два сокета: [list] [*]Один сокет привязан к порту 80 с помощью INADDR_ANY, что означает, что он прослушивает все доступные IP-адреса. Другой сокет, привязанный к порту 80 на определенном IP-адресе, 192.168.1.4. [/list] Мой вопрос: : [list] [*]Если клиент пытается подключиться к 192.168.1.4 через порт 80, существует ли вероятность того, что соединение может быть обработано? сокетом, привязанным к INADDR_ANY вместо явно привязанного к 192.168.1.4?
[*]Я также используя параметр сокета SO_REUSEPORT в обоих сокетах. Может ли это повлиять на маршрутизацию соединений или это связано исключительно с тем, что оба сокета могут без ошибок привязываться к одному и тому же порту?
[/list] Вот соответствующий фрагмент того, как я привязываю сокеты: [code]// 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);
// 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"); } [/code] Что я уже узнал: [list] [*]Сокет, привязанный к INADDR_ANY, прослушивает все доступные IP-адреса, в то время как другой сокет прослушивает только 192.168.1.4. [*]Опция SO_REUSEPORT позволяет обоим сокетам привязываться к одному и тому же порту без ошибок, но насколько насколько я понимаю, он не контролирует, какой сокет обрабатывает входящие соединения. [/list] Мои ключевые вопросы: [*][b]Есть ли сценарий, при котором соединение с адресом 192.168.1.4:80 может обрабатываться сокетом INADDR_ANY?[/b] [*][b]Какую роль здесь играет SO_REUSEPORT?[/b] Влияет ли это на то, какой сокет обрабатывает входящие соединения, или это актуально только во время процесса привязки?
Желаемое поведение: Я хочу, чтобы любые соединения, нацеленные на 192.168.1.4:80, всегда обрабатывались вторым сокетом (тот, который явно привязан к этому адресу), а соединения с другими IP-адресами (например, 127.0.0.1:80) обрабатываются сокетом INADDR_ANY. Любые разъяснения или Будем очень признательны за подтверждение того, как Linux справляется с этим!
Я разрабатываю серверное приложение в Linux, и у меня возник вопрос о поведении привязки сокетов при использовании INADDR_ANY и определенных IP-адресов. Моя настройка включает два сокета:
Один сокет привязан к порту 80 с помощью INADDR_ANY, что...
Когда я использую сегмент URI 2, 3, он работает, но когда добавить сегмент URI 4, он не работает. /> Но это показывает, как это ...
http: // localhost/maruf/wrance-qb/bcs/how-has-the-phrase-digital-detox-been-explaide-in-the-passage?
и оба URL...
Привет, сообщество Stack Overflow!
Я столкнулся с проблемой во время работы над проектом, включающим каналы датаграмм Java NIO. Моя цель — открыть два сокета на одном порту: один с использованием IPv4, а другой с использованием IPv6. Однако каждый...
Вот декоратор, который принимает вызов (fn: Callable ) с той же подписью, что и функция, обернутая. Он работает и тип проверяет.import inspect
from typing import Any, Callable, ParamSpec, TypeVar, Union
Вот декоратор, который принимает вызов (fn: Callable ) с той же подписью, что и функция, обернутая. Он работает и тип проверяет.import inspect
from typing import Any, Callable, ParamSpec, TypeVar, Union