中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
Visual C++实现局域网IP多播(2)
作者:佚名 时间:2007-09-26 14:48 出处:yesky 责编:月夜寒箫
              摘要:Visual C++实现局域网IP多播(2)

(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;

}



Sender.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 remote;

 SOCKET sock,sockM;

 TCHAR sendbuf[BUFSIZE];

 int len = sizeof( struct sockaddr_in);

 //初始化WinSock2.2

 if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )

 {

printf("WSAStartup() failed\n");

return -1;

 }

 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;

 }

 //加入多播组

 remote.sin_family = AF_INET;

 remote.sin_port = htons(MCASTPORT);

 remote.sin_addr.s_addr = inet_addr( MCASTADDR );

 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)

 {

printf("SEND : ");

scanf("%s",sendbuf);

if( sendto(sockM,(char*)sendbuf,strlen(sendbuf),0,(struct sockaddr*)

&remote,sizeof(remote))==SOCKET_ERROR)

{

 printf("sendto failed with: %d\n",WSAGetLastError());

 closesocket(sockM);

 closesocket(sock);

 WSACleanup();

 return -1;

}

if(strcmp(sendbuf,"QUIT")==0) break;

Sleep(500);

 }

 closesocket(sockM);

 closesocket(sock);

 WSACleanup();

 return 0;

}



四、小结

本实例对IP多播通信进行了探讨,实例程序由Sender和Receiver两部分组成,Sender用户从控制台上输入多播发送数据,Receiver端都要求加入同一个多播组,完成接收Sender发送的多播数据。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有