科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件Visual C 实现局域网IP多播

Visual C 实现局域网IP多播

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:刘涛  来源:天极开发 2007年9月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

(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发送的多播数据。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章