Привяжите сокет к интерфейсу с помощью метода Bind() v с помощью Setsockopt()Linux

Ответить Пред. темаСлед. тема
Anonymous
 Привяжите сокет к интерфейсу с помощью метода Bind() v с помощью Setsockopt()

Сообщение Anonymous »

Мы запускаем код внутри Docker-контейнера [Ubuntu] как часть тестовой системы, которой необходимо открыть сокет на определенном интерфейсе (ppp0, созданный с помощью pppd тестируемым устройством), а не пересылать его через eth0.
Когда этот Docker-контейнер запускается под Raspbian , setockopt() делает свое дело, т.е. это работает:
struct ifreq interface = {0};
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

snprintf(interface.ifr_name, sizeof(interface.ifr_name), "ppp0");
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE,
&interface, sizeof(interface)) == 0) {
// Things routed through sock() appear on ppp0
...

Запуск того же контейнера Docker под Centos8 не дает достаточных разрешений (setsockopt() возвращает -1, а errno — это EPERM), поэтому я хотел бы использовать альтернативный метод, предложенный в этом ответе, используя вместо этого метод связывания().Однако я не могу заставить это работать (см. код ниже): метод bind() возвращает ноль, но активность связанного сокета не приводит к трафику на ppp0 или где-либо еще. еще, что я могу найти (т.е. тоже не eth0); это также работает на Docker-on-Raspbian, так что я могу переключаться между успешными и неудачными случаями.
Может ли кто-нибудь заметить мою [намеренную :-)] ошибку?
struct sockaddr_in bindAddress = {0};
struct ifaddrs *pInterfaceAddresses = NULL;
struct ifaddrs *pTmp;
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

bindAddress.sin_family = AF_INET;
if (getifaddrs(&pInterfaceAddresses) == 0) {
pTmp = pInterfaceAddresses;
while ((pTmp != NULL) && (bindAddress.sin_addr.s_addr == 0)) {
if ((strcmp(pTmp->ifa_name, "ppp0") == 0) &&
(pTmp->ifa_addr != NULL) &&
(pTmp->ifa_addr->sa_family == AF_INET)) {
bindAddress.sin_addr.s_addr = ((struct sockaddr_in *) pTmp->ifa_addr)->sin_addr.s_addr;
}
pTmp = pTmp->ifa_next;
}
freeifaddrs(pInterfaceAddresses);
}

if (bindAddress.sin_addr.s_addr != 0) {
// bind() returns zero but sock goes nowhere
bind(sock, (struct sockaddr *) &bindAddress, sizeof(bindAddress));
}


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу разрешить моему интерфейсу реагирования, развернутому на страницах GitHub, получать доступ к API-интерфейсу л
    Anonymous » » в форуме Python
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Почему ENODEV не документирован для вызова Setsockopt?
    Anonymous » » в форуме Linux
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Linux, setSockopt icmp_filter опция
    Anonymous » » в форуме Linux
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Javax to jakarta Migration: Glassfish Jaxb 4.x читает jakarta.xml.bind.nantations*, но не javax.xml.bind.annotation.*
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Путаница в отношении семантики ценности Bind :: Bind's Value
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

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