newasp home
用户管理  |  用户注册
首 页 ┆ 文章中心 ┆ 下载中心 ┆ 图片中心 ┆ 博客中心 ┆ 社区论坛 ┆ 客户留言
  • 站点首页
  • 电脑网络技术
  • 图形图像技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
用户名: 密码:
当前位置:PC我爱社区 → 文章中心 → 数据库设计 → 文章内容

用Visual C++实现局域网IP多播

减小字体 增大字体 作者:网络  来源:转载  发布时间:2008-7-4 15:13:06

(4)接收多播数据。

Sender实现步骤:

(1)创建一个SOCK_DGRAM类型的Socket。
(2)加入多播组。
(3)发送多播数据。

3、编译两个项目,在局域网中按如下步骤测试:

(1)将Sender.exe拷贝到发送多播数据的pc上。
(2)将Receiver.exe拷贝到多个要求接收多播数据的pc上。
(3)各自运行相应的程序。 
(4)在Sender PC上输入多播数据后,你就可以在Receiver PC上看到输入的多播数据。

三、程序代码

Receiver.c程序代码:

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例使用的多播组地址。
#define MCASTPORT 5150 //绑定的本地端口号。
#define BUFSIZE 1024 //接收数据缓冲大小。
int main( int argc,char ** argv)
{
 WSADATA wsd;
 struct sockaddr_in local,remote,from;
 SOCKET sock,sockM;
 TCHAR recvbuf[BUFSIZE];
 /*struct ip_mreq mcast; // Winsock1.0 */

 int len = sizeof( struct sockaddr_in);
 int ret;
 //初始化WinSock2.2
 if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )
 {
printf("WSAStartup() failed\n");
return -1;
 }
 /*
 创建一个SOCK_DGRAM类型的SOCKET
 其中,WSA_FLAG_MULTIPOINT_C_LEAF表示IP多播在控制面层上属于"无根"类型;
 WSA_FLAG_MULTIPOINT_D_LEAF表示IP多播在数据面层上属于"无根",有关控制面层和
 数据面层有关概念请参阅MSDN说明。
 */
 if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
 {
printf("socket failed with:%d\n",WSAGetLastError());
WSACleanup();
return -1;
 }
 //将sock绑定到本机某端口上。
 local.sin_family = AF_INET;
 local.sin_port = htons(MCASTPORT);
 local.sin_addr.s_addr = INADDR_ANY;
 if( bind(sock,(struct sockaddr*)&local,sizeof(local)) == SOCKET_ERROR )
 {
printf( "bind failed with:%d \n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
 }
 //加入多播组
 remote.sin_family = AF_INET;
 remote.sin_port = htons(MCASTPORT);
 remote.sin_addr.s_addr = inet_addr( MCASTADDR );
 /* Winsock1.0 */
 /*
 mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR);
 mcast.imr_interface.s_addr = INADDR_ANY;
 if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,

(char*)&mcast,sizeof(mcast)) == SOCKET_ERROR)
 {
printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d\n",WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
 }
 */
 /* Winsock2.0*/
 if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),

NULL,NULL,NULL,NULL,
JL_BOTH)) == INVALID_SOCKET)
 {
printf("WSAJoinLeaf() failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
 }
 //接收多播数据,当接收到的数据为"QUIT"时退出。
 while(1)
 {
if(( ret = recvfrom(sock,recvbuf,BUFSIZE,0,

(struct sockaddr*)&from,&len)) == SOCKET_ERROR)
{
 printf("recvfrom failed with:%d\n",WSAGetLastError());
 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return -1;
}
if( strcmp(recvbuf,"QUIT") == 0 ) break;
else {
 recvbuf[ret] = '\0';
 printf("RECV:' %s ' FROM <%s> \n",recvbuf,inet_ntoa(from.sin_addr));
}
 }

 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return 0;
}

上一页  [1] [2] [3]  下一页

[] [返回上一页] [打 印]
  • ·上一篇文章:编写ASP.NET应用程序的十大技巧
  • ·下一篇文章:VC++6.0在灰度数字图像增强处理中的应用

文章评论评论内容只代表网友观点,与本站立场无关!

用户名: ! 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容: !

         (注“!”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

频道栏目导航

  • 电脑网络技术
  • 图形图像技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
  • 更多分类

本类热门阅览

  • · Windows下如何用vc直接编译连接DDK...
  • · 如何为Vista/Win2008中的IIS7添加P...
  • · 如何建立SQL Server 2005数据库邮件...
  • · sql 2000与sql 2005相互转移的问题...
  • · C# 怎样实现远程连接SQL Server200...
  • · SQL Server2005数据库连接中常见问...
  • · VS 2008和老的VS 2005附件包的兼容...
  • · SQL 2005 XML最佳实施策略用法
  • · Sql server 2005密码安全追踪与存储...
  • · SQL Server2005高可用性方面的不足...
  • · 在SQL Server 2005中解决死锁问题
  • · 黑客编程:Delphi写QQ聊天记录器演示...

相关文章

  • ·用Visual C++实现局域网IP多播
  • ·用Visual C++实现局域网IP多播
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登陆
网站备案号:沪ICP备06047794号
本站的各类网络聊天工具,系统工具,媒体工具,绿色软件如有侵犯你的版权,请指出,本站将立即改正。
建议您使用1024*768分辨率浏览下载本站的免费软件(绿色软件)资源
软件站版权所有:PC我爱社区 站长:子昀 点击这里和我联系