Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在vxWorks中将套接字绑定到特定接口_C_Sockets_Multicast_Vxworks_Multicastsocket - Fatal编程技术网

C 如何在vxWorks中将套接字绑定到特定接口

C 如何在vxWorks中将套接字绑定到特定接口,c,sockets,multicast,vxworks,multicastsocket,C,Sockets,Multicast,Vxworks,Multicastsocket,我正在尝试将套接字绑定到计算机上的特定网络接口。我有两个名为interf0和interf1的网络接口。我想将套接字绑定到一个特定的接口,比如interf0。我的操作系统是vxWorks 6.2 我正在尝试以下代码: struct sockaddr_in fromAddr; struct sockaddr_in sin; int fromLen; struct ip_mreq ipMreq; int sockDesc; STATUS temp;

我正在尝试将套接字绑定到计算机上的特定网络接口。我有两个名为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;
    }
fromAddr中的结构sockaddr\u; sin中的结构sockaddr_; int fromLen; 结构ip_mreq ipMreq; int sockDesc; 状态温度; 如果((sockDesc=socket(AF_INET,SOCK_DGRAM,0))<0) { printf(“无法打开recv套接字\n”); 返回误差; } bzero((char*)和sin,sizeof(sin)); bzero((char*)和fromAddr,sizeof(fromAddr)); fromLen=sizeof(fromAddr); #如果1 如果((温度=setsockopt(sockDesc,SOL_SOCKET,SO_BINDTODEVICE,“interf0”,7))<0) { perror(“SO_BINDTODEVICE的服务器-setsockopt()错误”); printf(“%s\n”,strerror(errno)); 关闭(sockDesc); 返回误差; } #恩迪夫 sin.sin_len=(u_char)sizeof(sin); sin.sin_family=AF_INET; sin.sin\u addr.s\u addr=INADDR\u ANY; //sin.sin\u addr.s\u addr=inet\u addr(ifAddr); /*与接收到的数据包匹配的UDP端口号*/ sin.sin_port=htons(mcasport); /*将端口号绑定到套接字*/ if(bind(sockDesc,(struct sockaddr*)&sin,sizeof(sin))!=0) { 佩罗(“绑定”); if(sockDesc!=错误) { 关闭(sockDesc); } 返回误差; } 这里,它给出了一个错误,表示SO_BINDTODEVICE未定义

在vxWorks中有没有其他方法可以绑定到特定的接口

其他参考:


谢谢。

看来SO_BINDTODEVICE不是POSIX的一部分,它是一个Linux扩展。因此,如果VxWorks能够实现接口绑定,那么它就不一定以同样的方式实现接口绑定。快速浏览VxWorks手册似乎没有希望


如果您有VxWorks,您可能还可以获得WindRiver的支持,前提是您已经支付了支持费用。如果是这样,也要问他们,这就是它的目的。

ifAddr在上面的代码中是用点符号表示的接口IP地址。然而,这并不是单独起作用的。(即使用setsockopt注释)您是否尝试在vxWorks中使用SO_OUTIF?我们已经使用它在vxWorks 5.5中设置出站接口。