求助:在Tornado2.2中,如何用多个vxsim模拟UDP广播

Yunhao_Liu 发布于 2015/06/26 09:55
阅读 510
收藏 0
如题,在vxworks上实现udp广播,然而没有开发板,用Tornado中的vxsim模拟,代码如下
#include "vxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "hostLib.h"
#include "ioLib.h"
#include "strLib.h"

#define SA_LEN sizeof(struct sockaddr_in)
#define MSG "1234567890"
#define MSG_SIZE 11

/*broadcast function*/
STATUS bcast (void){

        int bcastSocket;/*广播socket*/
        struct sockaddr_in bcastAddr;/*广播地址*/
        int bcastFlag = 1;/*允许广播设置为1*/

        /*要为广播socket绑定本地端口地址*/
        struct sockaddr_in nativeAddr;
        bzero((char*) &nativeAddr,SA_LEN);
        nativeAddr.sin_family = AF_INET;
        nativeAddr.sin_len = SA_LEN;        
        nativeAddr.sin_port = htons(5000);
        if((nativeAddr.sin_addr.s_addr = hostGetByName("vxTarget")) == ERROR)
        {
                perror("Client:unknown server name.\n");
                return(ERROR);
        }
        
        /*创建socket*/
        if((bcastSocket = socket(AF_INET,SOCK_DGRAM,0)) < 0 ){
                perror("bcast: socket");
                close(bcastSocket);
                return ERROR;
               }
        /*绑定本地端口地址*/
        if(bind(bcastSocket,(struct sockaddr *) &nativeAddr,SA_LEN) == ERROR)
        {
                perror("Server:bind failed.\n");
                close(bcastSocket);
                return(ERROR);
        }
        /*设置socket为可以发送广播的*/
        if(setsockopt(bcastSocket,SOL_SOCKET,SO_BROADCAST,(char*)&bcastFlag,sizeof(bcastFlag)) == -1 ){
                perror("bcast:setsockopt");
                close(bcastSocket);
                return ERROR;
        }
        /*初始化广播地址*/
        bzero((char*) &bcastAddr,SA_LEN);
        bcastAddr.sin_family = AF_INET;
        bcastAddr.sin_len = SA_LEN;
        bcastAddr.sin_port = htons(5000);
        bcastAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);

        
        /*发送广播消息*/
        if(sendto (bcastSocket,MSG,MSG_SIZE,0,(struct sockaddr *)&bcastAddr,SA_LEN) < 0)
                perror("bcast  broadcast");
        close(bcastSocket);
        return(OK);
        
}
/*recvive function*/
STATUS jieshou()
{
        int s;
        struct sockaddr_in clientAddr,serverAddr;
        int addrLen = SA_LEN;
        char recvBuf[MSG_SIZE+1];
        int nRecv;

        int set = 1;
        
        s = socket(AF_INET,SOCK_DGRAM,0);
        if( s < 0 )
        {
                perror("Server: opening datagram socket");
                return(ERROR);
        }

        bzero((char *) &serverAddr,SA_LEN);
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_len = SA_LEN;
        serverAddr.sin_port = htons(5000);
        serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

        if(bind(s,(struct sockaddr *) &serverAddr,SA_LEN) == ERROR)
        {
                perror("Server:bind failed.\n");
                close(s);
                return(ERROR);
        }
        
        while(TRUE)
        {
                printf("nRecv is: %d\n",nRecv);
                nRecv = recvfrom(s, recvBuf,MSG_SIZE,0,(struct sockaddr *) &clientAddr,&addrLen);
                printf("nRecv is: %d\n",nRecv);
                if(nRecv < 0)
                {
                        perror("Server:recvfrom");
                        continue;
                }
                printf("msg = %s\n",recvBuf);
                printf("node[%s]:the connected client ip=[%s],port=             [%hd]\n",inet_ntoa(serverAddr.sin_addr),inet_ntoa(clientAddr.sin_addr),clientAddr.sin_port);
                
        }

}


以上代码可通过编译而且执行时不会报错,广播函数sendto发送正常,但是接收函数无法接收到广播消息。请问各位大神这是怎么回事?难道是Tornado2.2中的vxsim不支持广播?另外,我已经在这个环境下用两个vxsim实现了udp的单播。
加载中
返回顶部
顶部