CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

如何实现组播?用mfc或者c都可以,需要在操作系统做什么设置吗?

楼主djhdu(小火花)2002-06-12 10:21:53 在 VC/MFC / 基础类 提问

这是我的一段代码,但是不起作用!  
  SOCKET     s;  
  struct   ip_mreq   ipmr;  
  struct   sockaddr_in     local,from;  
  char     recvbuf[2480];  
  int     len=sizeof(struct   sockaddr_in);  
  long   ret;  
   
  s=socket(AF_INET,SOCK_DGRAM,0);  
  local.sin_family=AF_INET;  
  local.sin_addr.s_addr=htonl(INADDR_ANY);  
  local.sin_port=htons(5520);  
   
  ipmr.imr_multiaddr.s_addr=inet_addr("224.2.223.193");  
  ipmr.imr_interface.s_addr=htonl(INADDR_ANY);  
   
  bind(s,(SOCKADDR   *)&local,sizeof(local));  
  if   (setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char   *)&ipmr,sizeof(ipmr))==SOCKET_ERROR)   {  
  TRACE("SetSocketOpt失败\n");  
  return;  
  }  
  else   {  
  TRACE("设置组播成功\n");  
  }  
   
   
  while   (1)   {  
  if   ((ret=recvfrom(s,recvbuf,2480,0,(struct   sockaddr   *)&from,&len))==SOCKET_ERROR)   {  
  TRACE("recvfrom   failed\n");  
                  }  
  else   {  
  TRACE("TestSocket---------%s,length=%d\n",inet_ntoa(from.sin_addr),ret);  
  }  
  } 问题点数:100、回复次数:3Top

1 楼xuying()回复于 2002-06-12 10:29:42 得分 60

组播不需要什么特殊的设置。下面是的代码在win2k   局域网环境下试验通过:  
   
  //发送方程序   sender.c  
   
  #include   <winsock2.h>  
  #include   <ws2tcpip.h>  
  #include   <stdio.h>  
   
  #define   BUFFSIZE   2048  
  #define   IP_ADDR             "224.8.8.1"            
  #define   DEST_PORT                   8888  
   
  int   main(int   argc,char   *argv[])  
  {  
          int   sockfd;  
          struct   sockaddr_in   addr;  
          char   szError[100];  
  char   buf[]   =   "Hello,   World!";  
  int   ttl   =   255   ;   //   Arbitrary   TTL   value.  
   
          WSADATA   WSAData;  
          WORD     wVersionRequested;  
          wVersionRequested   =   MAKEWORD(2,   2);  
          if   (WSAStartup   (wVersionRequested   ,   &WSAData)   !=   0)    
          {  
                  printf   ("recver:Initialize   Winsock   error!");  
                  exit(1);  
          }  
          if   (LOBYTE(WSAData.wVersion)   !=   2   ||   HIBYTE(WSAData.wVersion)   !=   2   )   {  
                  WSACleanup(   );  
                  printf   ("setsockopt   failed!   Error:   %d",   WSAGetLastError   ());  
                  exit(1);  
          }    
   
          addr.sin_family   =   AF_INET;  
          addr.sin_port   =   htons(DEST_PORT);  
          addr.sin_addr.s_addr   =   inet_addr(IP_ADDR);  
           
          if   ((sockfd=socket(AF_INET,SOCK_DGRAM,0))   <   0)   {  
                  printf("sender:new   a   socket   error!\n");  
                  exit(1);          
          }  
   
  if(setsockopt(sockfd,   IPPROTO_IP,   IP_MULTICAST_TTL,   (char   *)&ttl,   sizeof(ttl))!=0)    
  {  
  printf("error   setsockopt   IP_MULTICAST_TTL\n");  
  exit(1);  
  }  
  /*  
          if   (bind(sockfd,(struct   sockaddr   *)&recver_addr,sizeof(recver_addr))   <   0)   {  
                  closesocket(sockfd);  
                  printf("recver:bind   socket   error!\n");  
                  exit(1);          
          }  
  */  
           
      if   (sendto   (sockfd,   buf,   sizeof(buf)   ,   0,   (struct   sockaddr   *)&addr,   sizeof(addr))  
  ==   SOCKET_ERROR)  
      {  
          wsprintf   (szError,   TEXT("sendto   failed!   Error:   %d"),    
                              WSAGetLastError   ());  
          MessageBox   (NULL,   szError,   TEXT("Error"),   MB_OK);  
          closesocket   (sockfd);  
          return   FALSE;  
      }  
      else  
      {  
          printf("send   ok\n");  
      }  
   
  //   Close   Sock.  
  closesocket   (sockfd);  
  WSACleanup   ();  
  return   0;  
  }  
   
  //   接收方程序   receivers.c  
   
  //#include   <windows.h>  
  #include   <winsock2.h>  
  #include   <ws2tcpip.h>  
  #include   <stdio.h>  
   
  #define   BUFFSIZE   2048  
  #define   RECV_IP_ADDR             "224.8.8.1"            
  #define   DEST_PORT                   8888  
   
  int   main(int   argc,char   *argv[])  
  {  
          int   sockfd;  
          int   sock_reuse   =   1;  
          struct   ip_mreq   multicast;  
          struct   sockaddr_in   recver_addr;  
          char   szError[100];  
   
      int   index   =   0,                                             //   Integer   index  
              iRecvLen;                                               //   Length   of   recv_sin  
      char   szMessageA[1024*320];                               //   ASCII   string    
      TCHAR   szMessageW[1024*320];                             //   Unicode   string  
           
          WSADATA   WSAData;  
          WORD     wVersionRequested;  
          wVersionRequested   =   MAKEWORD(2,   2);  
          if   (WSAStartup   (wVersionRequested   ,   &WSAData)   !=   0)    
          {  
                  printf   ("recver:Initialize   Winsock   error!");  
                  exit(1);  
          }  
          if   (LOBYTE(WSAData.wVersion)   !=   2   ||   HIBYTE(WSAData.wVersion)   !=   2   )   {  
                  WSACleanup(   );  
                  printf   ("setsockopt   failed!   Error:   %d",   WSAGetLastError   ());  
                  exit(1);  
          }    
   
          multicast.imr_multiaddr.s_addr   =   inet_addr(RECV_IP_ADDR);  
          multicast.imr_interface.s_addr   =   htonl(INADDR_ANY);  
          recver_addr.sin_family   =   AF_INET;  
          recver_addr.sin_port   =   htons(DEST_PORT);  
          recver_addr.sin_addr.s_addr   =   INADDR_ANY;  
           
          if   ((sockfd=socket(AF_INET,SOCK_DGRAM,0))   <   0)   {  
                  printf("recver:new   a   socket   error!\n");  
                  exit(1);          
          }  
          if   (setsockopt(sockfd,   SOL_SOCKET,   SO_REUSEADDR,   (char   *)&sock_reuse,   sizeof(sock_reuse))   <   0)   {  
                      printf("recver   :   socket   options   set   error");  
                      exit(1);  
          }  
   
          if   (bind(sockfd,(struct   sockaddr   *)&recver_addr,sizeof(recver_addr))   <   0)   {  
                  closesocket(sockfd);  
                  printf("recver:bind   socket   error!\n");  
                  exit(1);          
          }  
           
          if   (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char   *)&multicast,sizeof(multicast))   <   0   )   {  
                  sprintf   (szError,   TEXT("setsockopt   failed!   Error:   %d"),   WSAGetLastError   ());  
                  printf("%s\n",   szError);  
                  closesocket(sockfd);  
                  exit(1);  
          }  
   
  printf("Receive   on   %s:%d\n",   RECV_IP_ADDR,   DEST_PORT);  
      iRecvLen   =   sizeof   (recver_addr);  
      memset(szMessageA,   0,   sizeof(szMessageA));  
      //   Receive   data   from   the   multicasting   group   server.  
      if   (recvfrom   (sockfd,    
                                  szMessageA,  
                                  sizeof(szMessageA),                    
                                  0,  
                                  (struct   sockaddr   FAR   *)   &recver_addr,  
                                  &iRecvLen)   ==   SOCKET_ERROR)  
      {  
          wsprintf   (szError,   TEXT("recvfrom   failed!   Error:   %d"),    
                              WSAGetLastError   ());  
          MessageBox   (NULL,   szError,   TEXT("Error"),   MB_OK);  
          closesocket   (sockfd);  
          return   FALSE;  
      }  
      else  
      {  
          //   Convert   the   ASCII   string   to   a   Unicode   string.  
          for   (index   =   0;   index   <=   sizeof   (szMessageA);   index++)  
              szMessageW[index]   =   szMessageA[index];  
   
          MessageBox   (NULL,   szMessageW,   TEXT("Info"),   MB_OK);  
      }  
   
      //   Disable   receiving   on   Sock   before   closing   it.  
      shutdown   (sockfd,   0x00);  
   
      //   Close   Sock.  
      closesocket   (sockfd);  
   
      WSACleanup   ();  
          return   0;  
  }  
  Top

2 楼djhdu(小火花)回复于 2002-06-12 10:45:16 得分 0

哦,是不是只要发送给这个组播地址,其它组播接收程序就都可以收到?Top

3 楼xuying()回复于 2002-06-12 11:02:33 得分 40

发送程序很简单,只要给组播地址发就可以了。  
  接收的时候要先加入组播组。就是下面这一段程序:  
  if   (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char   *)&multicast,sizeof(multicast))   <   0   )   {  
                  sprintf   (szError,   TEXT("setsockopt   failed!   Error:   %d"),   WSAGetLastError   ());  
                  printf("%s\n",   szError);  
                  closesocket(sockfd);  
                  exit(1);  
  Top

4 楼xuying()回复于 2002-06-12 11:03:34 得分 0

发送程序很简单,只要给组播地址发就可以了。  
  接收的时候要先加入组播组。就是下面这一段程序:  
  if   (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char   *)&multicast,sizeof(multicast))   <   0   )   {  
                  sprintf   (szError,   TEXT("setsockopt   failed!   Error:   %d"),   WSAGetLastError   ());  
                  printf("%s\n",   szError);  
                  closesocket(sockfd);  
                  exit(1);  
  Top

相关问题

  • 操作系统与c
  • 用C模拟DOS操作系统
  • 我看过《C程序设计》(谭)、《C++ Primer中文版》、《Windows程序设计》、《Windows核心编程》、《深入浅出MFC》、《Windows操作系统原
  • C语言编程——操作系统中的文件管理!
  • C#开发你在单位里配套什么操作系统?
  • c#中如何获得操作系统所在的盘符
  • 要学好C/C++必须要学编译原理和操作系统吗?
  • Win98(Drive C:)与WinNT4(Drive G:)双操作系统,如何完全移除WinNT4?
  • 在LINUX下如何用C编程获得操作系统类型版本号
  • 哪个C++编译器能编译操作系统?请高手指点

关键词

  • 组播
  • ipmr
  • recver
  • addr
  • wsadata
  • wversionrequested
  • imr
  • sin
  • inet
  • wversion

得分解答快速导航

  • 帖主:djhdu
  • xuying
  • xuying

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo