一小时掌握UDP单播和UDP组播编程(代码实例亲测有效)(Win10 64位)

 

#include <WINSOCK.H>
#include <stdio.h>
#define HELLO_PORT  7905    
#define HELLO_GROUP "228.4.5.6"    
#pragma comment(lib, "WSOCK32.lib")
#define MSGBUFSIZE 156
int main(int argc, char *argv[])    
{ 
 int server =0;
 if(!strncmp(argv[1],"-s",2))
{
  server =1;
}
if(!server)
{
 WSADATA     wsaData;
  // Initialize Windows socket library
    WSAStartup(MAKEWORD(2,2), &wsaData);
    struct sockaddr_in addr;    
    int fd, cnt;    
    char *message="Hello, World!";    
    /* create what looks like an ordinary UDP socket */    
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
    {    
        perror("socket");    
        exit(1);    
    }    
    /* set up destination address */    
    memset(&addr,0,sizeof(addr));    
    addr.sin_family=AF_INET;    
    addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
    addr.sin_port=htons(HELLO_PORT);    
    /* now just sendto() our destination! */    
    while (1)    
    {    
        if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
        {    
            perror("sendto");    
            exit(1);    
        }    
    printf("Send %s\n",message);
        Sleep(1000);    
    }    
    return 0;    
}
else
{
WSADATA     wsaData;
  // Initialize Windows socket library
  WSAStartup(MAKEWORD(2,2), &wsaData);
    struct sockaddr_in addr;    
    int fd, nbytes,addrlen;    
    struct ip_mreq mreq;    
    char msgbuf[MSGBUFSIZE];    
    u_int yes=1; /*** MODIFICATION TO ORIGINAL */    
    /* create what looks like an ordinary UDP socket */    
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
    {    
        perror("socket");    
        exit(1);    
    }    
    /**** MODIFICATION TO ORIGINAL */    
    /* allow multiple sockets to use the same PORT number */    
    if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)) < 0)     
    {    
        perror("Reusing ADDR failed");    
        exit(1);    
    }    
    /*** END OF MODIFICATION TO ORIGINAL */    
    /* set up destination address */    
    memset(&addr,0,sizeof(addr));    
    addr.sin_family=AF_INET;    
    addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    
    addr.sin_port=htons(HELLO_PORT);    
    /* bind to receive address */    
    if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
    {    
        perror("bind");    
        exit(1);    
    }    
    /* use setsockopt() to request that the kernel join a multicast group */    
    mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
    mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
    if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)     
    {    
    int err=GetLastError();
        printf("setsockopt:%d",err);    
        exit(1);    
    }    
    /* now just enter a read-print loop */    
    while (1)     
    {    
        //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
        addrlen=sizeof(addr);  
    printf("Receiving..."); 
        //if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,NULL,NULL))<0)
    if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)     
        {    
            perror("recvfrom");    
            exit(1);    
        } msgbuf[nbytes]  ='\0'; 
        printf("%s",msgbuf);    
    }    
    return 0;    
}    
}    
将其中server段程序中的加入组播组部分程序注释掉,并将组播地址修改为单播地址,那么这程序就变成了UDP单播。即

/* use setsockopt() to request that the kernel join a multicast group */    
    mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
    mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
    if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)     
    {    
    int err=GetLastError();
        printf("setsockopt:%d",err);    
        exit(1);    
    }    

部分的程序。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Boost 库接收 UDP数据的主要区别有以下几点: 1. 组需要设置套接字的 TTL(Time-To-Live)选项,以确定数据包的最大传输距离。 2. 组需要加入组组,以接收特定的组数据。 3. 需要设置远程地址和端口号,以接收特定的数据。 下面是一些示例代码,以说明如何使用 Boost 库接收 UDP数据。 ### 接收 UDP数据 以下示例代码演示了如何使用 Boost 库接收 UDP数据: ```c++ #include <iostream> #include <boost/asio.hpp> #include <boost/array.hpp> using boost::asio::ip::udp; int main() { try { boost::asio::io_context io_context; // 创建 UDP 套接字 udp::socket socket(io_context, udp::endpoint(udp::v4(), 12345)); // 设置 TTL 选项 socket.set_option(boost::asio::ip::multicast::hops(1)); // 加入组udp::endpoint multicast_endpoint(boost::asio::ip::address::from_string("239.255.0.1"), 12345); socket.set_option(boost::asio::ip::multicast::join_group(multicast_endpoint.address())); // 接收数据 boost::array<char, 1024> recv_buffer; udp::endpoint sender_endpoint; size_t len = socket.receive_from(boost::asio::buffer(recv_buffer), sender_endpoint); // 打印接收到的数据 std::cout.write(recv_buffer.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } ``` ### 接收 UDP 数据 以下示例代码演示了如何使用 Boost 库接收 UDP 数据: ```c++ #include <iostream> #include <boost/asio.hpp> #include <boost/array.hpp> using boost::asio::ip::udp; int main() { try { boost::asio::io_context io_context; // 创建 UDP 套接字 udp::socket socket(io_context, udp::endpoint(udp::v4(), 12345)); // 接收数据 boost::array<char, 1024> recv_buffer; udp::endpoint sender_endpoint; size_t len = socket.receive_from(boost::asio::buffer(recv_buffer), sender_endpoint); // 打印接收到的数据 std::cout.write(recv_buffer.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } ``` 注意,这两个示例代码非常相似,唯一的区别在于组示例代码需要设置 TTL 选项和加入组组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值