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

YunhaoLiu 2015-06-26 09:57:31
如题,在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的单播。
...全文
361 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20866721 2016-09-14
  • 打赏
  • 举报
回复
发送函数中的广播地址于接收函数的服务器地址是不是一样?
haojj123 2015-07-02
  • 打赏
  • 举报
回复
你需要建立一个模拟的镜像,对网卡进行设置,网上有很多相关的资料

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧