Когда этот 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