多播

  1. /************************************************************************/
  2. /* recver                                                                     */
  3. /************************************************************************/
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <WinSock2.h>
  8. using namespace std;
  9. #pragma comment(lib, "Ws2_32")
  10. #define MCASTADDR "233.0.0.5" //本例使用的多播组地址。
  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13.  int nRet;
  14.  //fun(0x8899, 0x1100);
  15.  WSAData wsaData;
  16.  nRet = ::WSAStartup(MAKEWORD(2,2), &wsaData);
  17.  SOCKET sock = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0,
  18.                       WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF
  19.        | WSA_FLAG_MULTIPOINT_D_LEAF);
  20.  BOOL bFlag = TRUE;
  21.  nRet = ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &bFlag, sizeof(BOOL));
  22.  sockaddr_in sockAddr;
  23.  memset(&sockAddr, 0, sizeof(sockaddr_in));
  24.  sockAddr.sin_family = AF_INET;
  25.  sockAddr.sin_addr.S_un.S_addr = INADDR_ANY;
  26.  sockAddr.sin_port = htons(5050);
  27.  nRet = ::bind(sock, (struct sockaddr*) &sockAddr, sizeof(sockaddr_in));
  28.  if (SOCKET_ERROR == nRet)
  29.  {
  30.   cout<<WSAGetLastError()<<endl;
  31.  }
  32.  
  33.  int nTtl = 1;
  34.  DWORD cbRet;
  35.  BOOL bLoopBack = TRUE;
  36.  nRet = ::WSAIoctl(sock, SIO_MULTICAST_SCOPE, &nTtl,sizeof(int), NULL, 0, &cbRet, NULL, NULL);
  37.  nRet = ::WSAIoctl(sock, SIO_MULTIPOINT_LOOPBACK, &bLoopBack, sizeof(bLoopBack), NULL, 0, &cbRet, NULL,NULL);
  38.  sockaddr_in remote;
  39.  memset(&remote,0,sizeof(remote));
  40.  remote.sin_family = AF_INET;
  41.  remote.sin_addr.s_addr = inet_addr(MCASTADDR);
  42.  remote.sin_port = htons(5050); 
  43.  SOCKET sockM = WSAJoinLeaf(sock,(sockaddr*)&remote,sizeof(remote), NULL,NULL,NULL,NULL,JL_BOTH);
  44.  int nAddrLen = sizeof(sockaddr_in);
  45.  sockaddr_in srcAddr;
  46.  char *buf = new char[1024];
  47.  for(;;)
  48.  {
  49.   memset(buf, 0, 1024);
  50.   memset(&srcAddr, 0, sizeof(sockaddr_in));
  51.   nRet = ::recvfrom(sock, buf, 1024, 0, (struct sockaddr*) &srcAddr, &nAddrLen);
  52.   if (SOCKET_ERROR != nRet)
  53.   {
  54.    cout<<"The Src IP: "<<inet_ntoa(srcAddr.sin_addr)<<endl;
  55.    cout<<"The Src Port: "<<ntohs(srcAddr.sin_port)<<endl;
  56.    cout<<"The recv buf: "<<buf<<endl;
  57.    cout<<"--------------------------------------------------------------"<<endl;
  58.   }
  59.  }
  60.  delete [] buf;
  61.  buf = NULL;
  62.  closesocket(sockM);
  63.  closesocket(sock);
  64.  WSACleanup();
  65.  //nRet = ::WSAAsyncSelect(sock, NULL, NULL, FD_READ);
  66.  return 0;
  67. }
  68.  
  69. /************************************************************************/
  70. /* sender                                                                     */
  71. /************************************************************************/
  72. #include "stdafx.h"
  73. #include <iostream>
  74. #include <string>
  75. #include <WinSock2.h>
  76. using namespace std;
  77. #pragma comment(lib, "Ws2_32")
  78. #define MCASTADDR "233.0.0.5"
  79. int _tmain(int argc, _TCHAR* argv[])
  80. {
  81.  int nRet;
  82.  WSAData wsaData;
  83.  nRet = ::WSAStartup(MAKEWORD(2,2), &wsaData);
  84.  SOCKET sock = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0,
  85.   WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF
  86.   | WSA_FLAG_MULTIPOINT_D_LEAF);
  87.  BOOL bFlag = TRUE;
  88.  nRet = ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &bFlag, sizeof(BOOL));
  89.  int nTtl = 1;
  90.  DWORD cbRet;
  91.  BOOL bLoopBack = TRUE;
  92.  nRet = ::WSAIoctl(sock, SIO_MULTICAST_SCOPE, &nTtl,sizeof(int), NULL, 0, &cbRet, NULL, NULL);
  93.  nRet = ::WSAIoctl(sock, SIO_MULTIPOINT_LOOPBACK, &bLoopBack, sizeof(bLoopBack), NULL, 0, &cbRet, NULL,NULL);
  94.  sockaddr_in remote;
  95.  memset(&remote,0,sizeof(remote));
  96.  remote.sin_family = AF_INET;
  97.  remote.sin_addr.s_addr = inet_addr(MCASTADDR);
  98.  remote.sin_port = htons(5050); 
  99.  SOCKET sockM = WSAJoinLeaf(sock,(sockaddr*)&remote,sizeof(remote), NULL,NULL,NULL,NULL,JL_BOTH);
  100.  int nAddrLen = sizeof(sockaddr_in);
  101.  char buf[10] = "wangliwei";
  102.  nRet = ::sendto(sockM, buf, 10, 0, (sockaddr*) &remote, nAddrLen);
  103.  if (SOCKET_ERROR != nRet)
  104.  {
  105.   cout<<"The remote IP: "<<inet_ntoa(remote.sin_addr)<<endl;
  106.   cout<<"The remote Port: "<<ntohs(remote.sin_port)<<endl;
  107.   cout<<"The Send buf: "<<buf<<endl;
  108.   cout<<"--------------------------------------------------------------"<<endl;
  109.  }
  110.  closesocket(sockM);
  111.  closesocket(sock);
  112.  WSACleanup();
  113.  return 0;
  114. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值