Как исправить ошибку EPERM для setsockopt (SO_MARK) под Android - PullRequest
0 голосов
/ 24 июня 2019

Я пытался маршрутизировать исходящее соединение , а не через VPN-туннель, поэтому я использую следующую последовательность для установления TCP-соединения (то же самое для сокетов UDP):

#define BP$M_NETID  0xFFFF0000UL
#define BP$M_EXPLSLCTD  0x00008000UL
#define BP$M_NOVPN  0x00000400UL
#define BP$M_PERMSN 0x00000300UL

int status, fwmark = {0};
socklen_t fwmarkLen = sizeof(fwmark);

        sd = socket (...)ж

        if ( 0 > (status = getsockopt(sd, SOL_SOCKET, SO_MARK, &fwmark, &fwmarkLen)) )
            return  $LOG(STS$K_ERROR, "getsockopt(%d, SO_MARK)->%d, errno=%d", sd, status, errno);

        fwmark |= BP$M_NOVPN;

        if ( 0 > (status = setsockopt(sd, SOL_SOCKET, SO_MARK, &fwmark, sizeof(fwmark)) )
            return  $LOG(STS$K_ERROR, "setsockopt(%d, SO_MARK, %#x)->%d, errno=%d", sd, fwmark, status, errno);

Я получаю следующееошибка: setsockopt (76, SO_MARK, 0x400) -> - 1, errno = 1

Итак, какова правильная последовательность для установки "ProtectFromVPN"?

...