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. }  

猜你喜欢

转载自blog.csdn.net/anton8801/article/details/79877551