windows C++ UDP 多播

  1. // 服务器端  
  2. // Server.cpp : Defines the entry point for the console application.  
  3. //  
  4.   
  5. #include <WinSock2.h>  
  6. #include <stdio.h>  
  7. #include <iostream>  
  8. using namespace std;  
  9.   
  10. #pragma comment(lib, “ws2_32.lib”)  
  11. const int MAX_BUF_LEN = 10;  
  12.   
  13. void main()  
  14. {  
  15.     WORD wVersionRequested;  
  16.     WSADATA wsaData;  
  17.     int err;  
  18.   
  19.     // 启动socket api  
  20.     wVersionRequested = MAKEWORD(2, 2);  
  21.     err = WSAStartup(wVersionRequested, &wsaData);  
  22.     if (err != 0)  
  23.     {  
  24.         return;  
  25.     }  
  26.   
  27.     if (LOBYTE(wsaData.wVersion) != 2 ||  
  28.         HIBYTE(wsaData.wVersion) != 2)  
  29.     {  
  30.         WSACleanup();  
  31.         return;  
  32.     }  
  33.   
  34.     // 创建socket  
  35.     SOCKET connect_socket;  
  36.     connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  37.     if (INVALID_SOCKET == connect_socket)  
  38.     {  
  39.         err = WSAGetLastError();  
  40.         printf(“error! error code is %d/n”, err);  
  41.         return;  
  42.     }  
  43.   
  44.     SOCKADDR_IN sin;  
  45.     sin.sin_family = AF_INET;  
  46.     sin.sin_port = htons(3779);  
  47.     //sin.sin_addr.s_addr = INADDR_BROADCAST;  
  48.     sin.sin_addr.s_addr = inet_addr(“255.255.255.255”);//设置广播地址,window下用这种形式方可  
  49.   
  50.     bool bOpt = true;  
  51.     //设置该套接字为广播类型  
  52.     setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  
  53.   
  54.     int nAddrLen = sizeof(SOCKADDR);  
  55.   
  56.     char buff[MAX_BUF_LEN] = “”;  
  57.     while (1)  
  58.     {  
  59.         sprintf_s(buff, “%s”,“ss”);  
  60.   
  61.         // 发送数据  
  62.         int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen);  
  63.         if (SOCKET_ERROR == nSendSize)  
  64.         {  
  65.             err = WSAGetLastError();  
  66.             printf(“error!, error code is %d/n”, err);  
  67.             return;  
  68.         }  
  69.         printf(“Send: %s/n”, buff);  
  70.         Sleep(500);  
  71.     }  
  72. }  
 
  1. // 客户端  
  2. // Client.cpp : Defines the entry point for the console application.  
  3. //  
  4.   
  5. #include <WinSock2.h>  
  6. #include <stdio.h>  
  7.   
  8. #pragma comment(lib, “ws2_32.lib”)  
  9. const int MAX_BUF_LEN = 255;  
  10.   
  11. void main()  
  12. {  
  13.     WORD wVersionRequested;  
  14.     WSADATA wsaData;  
  15.     int err;  
  16.   
  17.     // 启动socket api  
  18.     wVersionRequested = MAKEWORD(2, 2);  
  19.     err = WSAStartup(wVersionRequested, &wsaData);  
  20.     if (err != 0)  
  21.     {  
  22.         return;  
  23.     }  
  24.   
  25.     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)  
  26.     {  
  27.         WSACleanup();  
  28.         return;  
  29.     }  
  30.   
  31.     // 创建socket  
  32.     SOCKET connect_socket;  
  33.     connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  34.     if (INVALID_SOCKET == connect_socket)  
  35.     {  
  36.         err = WSAGetLastError();  
  37.         printf(“error! error code is %d/n”, err);  
  38.         return;  
  39.     }  
  40.   
  41.     // 用来绑定套接字  
  42.     SOCKADDR_IN sin;  
  43.     sin.sin_family = AF_INET;  
  44.     sin.sin_port = htons(3779);  
  45.     sin.sin_addr.s_addr = 0;  
  46.   
  47.     // 用来从网络上的广播地址接收数据  
  48.     SOCKADDR_IN sin_from;  
  49.     sin_from.sin_family = AF_INET;  
  50.     sin_from.sin_port = htons(3779);  
  51.     sin_from.sin_addr.s_addr = INADDR_BROADCAST;  
  52.   
  53.     //设置该套接字为广播类型,  
  54.     bool bOpt = true;  
  55.     setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  
  56.   
  57.     // 绑定套接字  
  58.     err = bind(connect_socket, (SOCKADDR*)&sin, sizeof(SOCKADDR));  
  59.     if (SOCKET_ERROR == err)  
  60.     {  
  61.         err = WSAGetLastError();  
  62.         printf(“error! error code is %d/n”, err);  
  63.         return;  
  64.     }  
  65.   
  66.     int nAddrLen = sizeof(SOCKADDR);  
  67.     char buff[MAX_BUF_LEN] = “”;  
  68.     int nLoop = 0;  
  69.     while (1)  
  70.     {  
  71.         // 接收数据  
  72.         int nSendSize = recvfrom(connect_socket, buff, MAX_BUF_LEN, 0, (SOCKADDR*)&sin_from, &nAddrLen);  
  73.         if (SOCKET_ERROR == nSendSize)  
  74.         {  
  75.             err = WSAGetLastError();  
  76.             printf(“error! error code is %d/n”, err);  
  77.             return;  
  78.         }  
  79.         buff[nSendSize] = ‘/0’;  
  80.         printf(“Recv: %s/n”, buff);  
  81.     }  
  82. }  
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 操作系统中,UDP 组播是一种同时向多个接收方传递数据包的通信方式。使用 UDP 协议进行组播通信可以减少网络流量,提高通信效率和可靠性。 在 C 语言中实现 UDP 组播,需要使用 Winsock API 进行网络编程。通过调用相关的库函数,实现 UDP 的创建、绑定、发送和接收等操作。 创建 UDP Socket:使用 socket() 函数创建 UDP Socket,确定 IP 地址族(IPv4/IPv6)、协议类型(UDP)和 Socket 类型(组播 Socket)。 绑定 Socket:使用 bind() 函数将 Socket 与指定的 IP 地址和端口号绑定。 发送数据包:使用 sendto() 函数向指定的组播地址和端口号发送数据包。 接收数据包:使用 recvfrom() 函数从组播组中接收数据包,并处理接收到的数据。 在使用 UDP 组播时,需要注意以下几点: 1. 组播地址需要在特定的范围内,一般为224.0.0.0至239.255.255.255的范围内,防止与其他网络通信冲突。 2. 不同的操作系统和网络环境下,组播协议的实现可能会有差异,需要根据具体情况进行调试和优化。 3. 组播通信有时会出现丢包或者乱序的情况,需要通过网络协议栈的相关机制进行处理,提高通信可靠性。 总之,UDP 组播是一种高效、可靠、灵活的网络通信方式,适用于多种应用场景,如视频直播、数据传输、分布式计算等。在 C 语言中实现 UDP 组播,需要掌握网络编程基础知识和相关的库函数,结合实际应用需求进行调试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值