现在的位置: 首页 > 综合 > 正文

UDP组播通信实现

2013年12月04日 ⁄ 综合 ⁄ 共 3587字 ⁄ 字号 评论关闭

UDP通信设计:

以代码模块的形式描述UDP组播通信的实现步骤。

  

#define GRUPOIP "233.8.8.8"
#define A_PORT     9000
#define B_PORT     8000
#define LOCAL_IP "127.0.0.1"

==========================================================================================================================
======================================================>A端操作流程如下:<===================================================
==========================================================================================================================
//1、启动socket
WSAStartup( MAKEWORD(2,2), &wsData );

//2、创建Socket
socketA = socket( AF_INET, SOCK_DGRAM ,IPPROTO_UDP );

//3、设置Socket属性,本地地址和端口重用
setsockopt(socketA, SOL_SOCKET, SO_REUSEADDR,(char*)&opt,sizeof(opt));//允许重用本地地址和端口,允许绑定已被使用的地址(或端口号)

//4、本地地址绑定
SOCKADDR_IN    addrLocal;
addrLocal.sin_family = AF_INET;
addrLocal.sin_addr.S_un.S_addr = inet_addr( LOCAL_IP );
addrLocal.sin_port = htons( SERVER_PORT );
nError = bind( socketA, (const sockaddr *)&addrLocal, sizeof(addrLocal) );

//5、通过设置setsockopt的方式将socket加入到组播,该操作一定要在“4、本地地址绑定之后”
ip_mreq  m_mcR;
m_mcR.imr_multiaddr.s_addr = inet_addr(GRUPOIP);
m_mcR.imr_interface.s_addr = ipbuf[0];//htons(INADDR_ANY);
int iRETT = setsockopt(sServer,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char FAR *)&m_mcR, sizeof(m_mcR));

//6 发送组播请求
SOCKADDR_IN  m_saHostGroup;
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(GRUPOIP);
m_saHostGroup.sin_port = htons(B_PORT);  //接收端的端口号
char acTemp[256] = "A端请求!";
nError = sendto( socketA, acTemp, sizeof(acTemp), 0,(struct sockaddr*)&m_saHostGroup,sizeof(m_saHostGroup));

//7、接收数据 recvfrom 函数中可以获取发送端的IP地址、端口信息
SOCKADDR_IN    addrSender;
nError = recvfrom( socketA, acRecvBuff, sizeof(acRecvBuff), 0, (sockaddr *)&addrSender, &addrSenderLen );

==========================================================================================================================
======================================================>B端操作流程如下:<===================================================
==========================================================================================================================

//1、启动socket
WSAStartup( MAKEWORD(2,2), &wsData );

//2、创建Socket
socketB = socket( AF_INET, SOCK_DGRAM ,IPPROTO_UDP );

//3、设置Socket属性,本地地址和端口重用
setsockopt(socketB, SOL_SOCKET, SO_REUSEADDR,(char*)&opt,sizeof(opt));//允许重用本地地址和端口,允许绑定已被使用的地址(或端口号)

//4、本地地址绑定
SOCKADDR_IN    addrLocal;
addrLocal.sin_family = AF_INET;
addrLocal.sin_addr.S_un.S_addr = inet_addr( LOCAL_IP );
addrLocal.sin_port = htons( B_PORT );
nError = bind( socketB, (const sockaddr *)&addrLocal, sizeof(addrLocal) );

//5、通过设置setsockopt的方式将socket加入到组播,该操作一定要在“4、本地地址绑定之后”
ip_mreq  m_mcR;
m_mcR.imr_multiaddr.s_addr = inet_addr(GRUPOIP);
m_mcR.imr_interface.s_addr = htons(INADDR_ANY);  //本地IP地址
int iRETT = setsockopt(socketB,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char FAR *)&m_mcR, sizeof(m_mcR));

//6、接收消息  recvfrom 函数中可以获取发送端的IP地址、端口信息
SOCKADDR_IN    addrSender;
nError = recvfrom( socketB, acRecvBuff, sizeof(acRecvBuff), 0, (sockaddr *)&addrSender, &addrSenderLen );

//7、发送回复数据
SOCKADDR_IN  m_saHostGroup;
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(GRUPOIP);
m_saHostGroup.sin_port = htons(B_PORT);
char acTemp[256] = "B端回复!";
nError = sendto( socketB, acTemp, sizeof(acTemp), 0,(struct sockaddr*)&addrSender,sizeof(addrSender));

 

==========================================================================================================================
======================================================>END<==============================================================
==========================================================================================================================

 

 

抱歉!评论已关闭.