Как привязать сокет к определенному интерфейсу в vxWorks

Я пытаюсь привязать сокет к определенному сетевому интерфейсу на моем компьютере. У меня есть два сетевых интерфейса с именами interf0 и interf1. Я хочу привязать сокет к определенному интерфейсу, скажем, interf0. Моя ОС vxWorks 6.2.

Я пытаюсь использовать следующий код:

    struct sockaddr_in fromAddr;
    struct sockaddr_in sin;
    int fromLen;
    struct ip_mreq ipMreq;
    int sockDesc;
    STATUS temp;

    if ((sockDesc = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf (" cannot open recv socket\n");
        return ERROR;
    }
    bzero ((char *)&sin, sizeof (sin));
    bzero ((char *) &fromAddr, sizeof(fromAddr));
    fromLen = sizeof(fromAddr);

#if 1
    if ((temp = setsockopt(sockDesc, SOL_SOCKET, SO_BINDTODEVICE, "interf0", 7)) < 0)
    {
        perror("Server-setsockopt() error for SO_BINDTODEVICE");
        printf("%s\n", strerror(errno));
        close(sockDesc);
        return ERROR;
    }
#endif

    sin.sin_len = (u_char) sizeof(sin);
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    //sin.sin_addr.s_addr = inet_addr(ifAddr);
    /* UDP port number to match for the received packets */
    sin.sin_port = htons (mcastPort);
    /* bind a port number to the socket */
    if (bind(sockDesc, (struct sockaddr *)&sin, sizeof(sin)) != 0)
    {
        perror("bind");
        if (sockDesc != ERROR)
        {
            close (sockDesc);
        }
        return ERROR;
    }

Здесь выдается ошибка о том, что SO_BINDTODEVICE не определен.

Есть ли другой способ, с помощью которого я могу привязаться к определенному интерфейсу в vxWorks.

Другая ссылка:
привязать сокет к сетевому интерфейсу

Спасибо.


person Jay    schedule 09.05.2017    source источник
comment
ifAddr в приведенном выше коде — это IP-адрес интерфейса в точечной нотации. Однако то же самое не работало в одиночку. (т.е. с комментариями setsockopt)   -  person Jay    schedule 09.05.2017
comment
Вы пробовали использовать SO_OUTIF в vxWorks? Мы использовали это для настройки исходящего интерфейса в vxWorks 5.5.   -  person Vikash Jain    schedule 12.05.2017


Ответы (1)


Кажется, что SO_BINDTODEVICE не является частью POSIX, это расширение Linux. Таким образом, VxWorks не обязательно будет реализовывать привязку интерфейса таким же образом, если вообще это делает. Беглый просмотр руководств по VxWorks выглядит бесперспективным.

Если у вас есть VxWorks, у вас, вероятно, также есть доступ к поддержке WindRiver, при условии, что вы вносите плату за поддержку. Если да, спросите их тоже, для этого они и существуют.

person bazza    schedule 09.05.2017