#include "vxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "stdioLib.h"
#include "strLib.h"
#include "ioLib.h"
#include "fioLib.h"
#include "UDP.h"
int sFd = 0; /* Socket描述符 */
/****************************************
函数名称:void InitUdpSocket()
返回值:无
入参: 无
函数描述:初始化Udp的Socket,具体包含以下操作:
1、创建Socket;
2、绑定Server端的地址。
****************************************/
void InitUdpSocket()
{
struct sockaddr_in LocalAddr; /* 服务器端的socket地址信息*/
int sockAddrSize; /* size of socket address structure */
/* 初始化地址 */
sockAddrSize = sizeof (struct sockaddr_in);
bzero ((char *) &LocalAddr, sockAddrSize);
LocalAddr.sin_len = (u_char) sockAddrSize;
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons (5500);
//LocalAddr.sin_addr.s_addr = htonl (INADDR_ANY);
LocalAddr.sin_addr.s_addr = inet_addr ("192.168.3.235");
/* 创建Socket */
if((sFd = socket(AF_INET,SOCK_DGRAM,0)) == ERROR)
{
printf("\r\n[ERROR]:socket() error in InitUdpSocket()!");
}
#if 1
/* bind socket to local address */
if (bind (sFd, (struct sockaddr *)&LocalAddr, sockAddrSize) == ERROR)
{
printf("\r\n[ERROR]:bind() error in InitUdpSocket()!");
close (sFd);
}
#endif
#if 0
if(setsockopt(sFd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&LocalAddr, sizeof(LocalAddr)) == ERROR)
{
printf("First Setsockopt Error!\n");
}
else
{
printf("First Setsockopt Ok!\n");
}
#endif
}
/****************************************
STATUS udpServer (UINT8 *pRcvData,UINT32 RcvDataLen,UINT32 Port)
返回值:ERROR ---接收失败; 非ERROR ---接收成功,接收到的字节个数
入参:pRcvData ---接收到的数据指针
Port ---接收的端口号
函数描述:Udp的接收函数
****************************************/
STATUS udpServer (UINT8 *pRcvData,UINT32 Port)
{
struct sockaddr_in clientAddr; /* 客户端的socket地址信息 */
int sockAddrSize; /* size of socket address structure */
int Ret = 0;
bzero((UINT8*)&clientAddr, sizeof(clientAddr));
sockAddrSize = sizeof(clientAddr);
Ret = recvfrom (sFd,pRcvData,1024,0,(struct sockaddr *)&clientAddr,&sockAddrSize);
if(Ret == ERROR)
{
printf("\r\n[ERROR]:recvfrom() error!");
close (sFd);
return (ERROR);
}
return (Ret);
}
/****************************************
函数名称:STATUS udpClient(char * serverName,UINT16 Port, UINT8* sndData,UINT32 lenth)
返回值:0 ---发送成功; 非0 ---发送失败
入参:serverName ---接收端(Server)的IP地址
Port ---端口号
sndData ---要发送数据的指针
lenth ---要发送的数据字节个数
函数描述:Udp的发送函数
****************************************/
STATUS udpClient(char * serverName,UINT16 Port, UINT8* sndData,UINT32 lenth)
{
struct sockaddr_in serverAddr; /* server's socket address */
int sockAddrSize; /* size of socket address structure */
/* 构建接收端的地址信息 */
sockAddrSize = sizeof (struct sockaddr_in);
bzero((char *)&serverAddr,sockAddrSize);
serverAddr.sin_len = (u_char)sockAddrSize;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons (Port);
/* 解析IP地址 */
if(((serverAddr.sin_addr.s_addr = inet_addr (serverName)) == ERROR) &&
((serverAddr.sin_addr.s_addr = hostGetByName (serverName)) == ERROR))
{
printf("\r\n[ERROR]:unknown server name.");
close(sFd);
return(ERROR);
}
/* 发送 */
if(sendto(sFd, (caddr_t)sndData, lenth, 0,
(struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
{
printf("\r\n[ERROR]:sendto error in udpClient()!");
close(sFd);
return (ERROR);
}
/* 关闭Socket */
/*close(sFd);*/
return (OK);
}
/****************************************
函数名称:void Test_UDP()
返回值:无
入参: 无
函数描述:Udp的测试函数
****************************************/
void Test_UDP()
{
UINT32 i = 0;
UINT32 count = 0;
UINT8 testData[2048] = {0};
int Ret = 0;
char IP[]= "192.168.3.236";
char rc[4] = "ack";
/* 初始化UDP */
InitUdpSocket();
while(1)
{
bzero(testData,256);
Ret = udpServer(testData,1101);
if(Ret!= ERROR)
{
udpClient(IP,1101,rc,3);
}
else
{
printf("\r\n[ERROR]:udpServer() in Test_UDP()!");
}
count++;
}
close (sFd);
}
void Test_UDP_T()
{
struct sockaddr_in serverAddr; /* server's socket address */
int sockAddrSize; /* size of socket address structure */
UINT32 i = 0;
UINT32 count = 0;
UINT8 testData[2048] = {0};
int Ret = 0;
char IP[]= "192.168.1.78";
/* 初始化UDP */
InitUdpSocket();
/* 构建接收端的地址信息 */
sockAddrSize = sizeof (struct sockaddr_in);
bzero((char *)&serverAddr,sockAddrSize);
serverAddr.sin_len = (u_char)sockAddrSize;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons (1101);
/* 解析IP地址 */
if(((serverAddr.sin_addr.s_addr = inet_addr (IP)) == ERROR) &&
((serverAddr.sin_addr.s_addr = hostGetByName (IP)) == ERROR))
{
printf("\r\n[ERROR]:unknown server name.");
close(sFd);
return(ERROR);
}
while(1)
{
/* 发送 */
if(sendto(sFd, (caddr_t)testData, 2048, 0,
(struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
{
printf("\r\n[ERROR]:sendto error in udpClient()!");
close(sFd);
break;
}
}
close (sFd);
}
void udpTest()
{
struct sockaddr_in serverAddr; /* server's socket address */
int sockAddrSize; /* size of socket address structure */
//UINT32 count = 0;
UINT8 testData[512] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a};
//UINT8 RecvData[512] = {0};
//int Ret = 0;
struct ip_mreq ipMultiCast;
int sendnt = 30;
char IP[]= "224.0.0.1"; //设置组播地址
InitUdpSocket(); //初始化Socket,绑定板子IP或者0.0.0.0都可以
mRouteAdd("224.0.0.1","192.168.3.235",0xFFFFFF00,0,0); //添加路由
ipMultiCast.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); //给Socket添加组播选项
ipMultiCast.imr_interface.s_addr = inet_addr("192.168.3.235");
if(setsockopt(sFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMultiCast, sizeof(struct ip_mreq)) == ERROR)
{
printf("Setsockopt Error!\n");
}
else
{
printf("Join Group Ok!\n");
}
/* 构建接收端的地址信息 */
sockAddrSize = sizeof (struct sockaddr_in);
bzero((char *)&serverAddr,sockAddrSize);
serverAddr.sin_len = (u_char)sockAddrSize;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons (5505);
/* 解析IP地址 */
if(((serverAddr.sin_addr.s_addr = inet_addr (IP)) == ERROR) &&
((serverAddr.sin_addr.s_addr = hostGetByName (IP)) == ERROR))
{
printf("\r\n[ERROR]:unknown server name.");
close(sFd);
}
//Ret = recvfrom (sFd,RecvData,512,0,(struct sockaddr *)&serverAddr,&sockAddrSize);
while(sendnt--)
{
#if 0
//接收
Ret = recvfrom (sFd,RecvData,512,0,(struct sockaddr *)&serverAddr,&sockAddrSize);
if(Ret == ERROR)
{
printf("\r\n[ERROR]:recvfrom() error!");
close (sFd);
}
else
{
printf("Ret = %d\n",Ret);
}
#endif
#if 1
taskDelay(sysClkRateGet());
/* 发送 */
//if(sendto(sFd, (caddr_t)testData, Ret, 0,(struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
if(sendto(sFd, (caddr_t)testData, 10, 0,(struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
{
printf("\r\n[ERROR]:sendto er