在Tornado2.2中,如何用多个vxsim模拟UDP广播
如题,在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的单播。