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<==============================================================
==========================================================================================================================