正确使用UDP广播(C++代码)

  1. // 服务器端  
  2. // Server.cpp : Defines the entry point for the console application.  
  3. //  
  4.  
  5. #include "stdafx.h"  
  6. #include <WinSock2.h>  
  7. #include <stdio.h>  
  8. #include <iostream>  
  9. using namespace std;  
  10.  
  11. #pragma comment(lib, "ws2_32.lib")  
  12.   
  13. const int MAX_BUF_LEN = 255;  
  14.   
  15. int _tmain(int argc, _TCHAR* argv[])  
  16. {  
  17.     WORD wVersionRequested;  
  18.     WSADATA wsaData;  
  19.     int err;  
  20.   
  21.     // 启动socket api  
  22.     wVersionRequested = MAKEWORD( 2, 2 );  
  23.     err = WSAStartup( wVersionRequested, &wsaData );  
  24.     if ( err != 0 )  
  25.     {  
  26.         return -1;  
  27.     }  
  28.   
  29.     if ( LOBYTE( wsaData.wVersion ) != 2 ||  
  30.         HIBYTE( wsaData.wVersion ) != 2 )  
  31.     {  
  32.             WSACleanup( );  
  33.             return -1;   
  34.     }  
  35.   
  36.     // 创建socket  
  37.     SOCKET connect_socket;  
  38.     connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  39.     if(INVALID_SOCKET == connect_socket)  
  40.     {  
  41.         err = WSAGetLastError();  
  42.         printf("/"socket/" error! error code is %d/n", err);  
  43.         return -1;  
  44.     }  
  45.   
  46.     SOCKADDR_IN sin;  
  47.     sin.sin_family = AF_INET;  
  48.     sin.sin_port = htons(3779);  
  49.     sin.sin_addr.s_addr = INADDR_BROADCAST;  
  50.   
  51.     bool bOpt = true;  
  52.     //设置该套接字为广播类型  
  53.     setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  
  54.   
  55.     int nAddrLen = sizeof(SOCKADDR);  
  56.   
  57.     char buff[MAX_BUF_LEN] = "";  
  58.     int nLoop = 0;  
  59.     while(1)  
  60.     {  
  61.         nLoop++;  
  62.         sprintf(buff, "%8d", nLoop);  
  63.   
  64.         // 发送数据  
  65.         int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen);  
  66.         if(SOCKET_ERROR == nSendSize)  
  67.         {  
  68.             err = WSAGetLastError();  
  69.             printf("/"sendto/" error!, error code is %d/n", err);  
  70.             return -1;  
  71.         }  
  72.         printf("Send: %s/n", buff);  
  73.         Sleep(500);  
  74.     }  
  75.   
  76.     return 0;  
  77. }  
  78.   
  79. // 客户端  
  80. // Client.cpp : Defines the entry point for the console application.  
  81. //  
  82.  
  83. #include "stdafx.h"  
  84. #include <WinSock2.h>  
  85. #include <stdio.h>  
  86.  
  87. #pragma comment(lib, "ws2_32.lib")  
  88.   
  89. const int MAX_BUF_LEN = 255;  
  90.   
  91. int _tmain(int argc, _TCHAR* argv[])  
  92. {  
  93.     WORD wVersionRequested;  
  94.     WSADATA wsaData;  
  95.     int err;  
  96.   
  97.     // 启动socket api  
  98.     wVersionRequested = MAKEWORD( 2, 2 );  
  99.     err = WSAStartup( wVersionRequested, &wsaData );  
  100.     if ( err != 0 )  
  101.     {  
  102.         return -1;  
  103.     }  
  104.   
  105.     if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )  
  106.     {  
  107.             WSACleanup( );  
  108.             return -1;   
  109.     }  
  110.   
  111.     // 创建socket  
  112.     SOCKET connect_socket;  
  113.     connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
  114.     if(INVALID_SOCKET == connect_socket)  
  115.     {  
  116.         err = WSAGetLastError();  
  117.         printf("/"socket/" error! error code is %d/n", err);  
  118.         return -1;  
  119.     }  
  120.   
  121.     // 用来绑定套接字  
  122.     SOCKADDR_IN sin;  
  123.     sin.sin_family = AF_INET;  
  124.     sin.sin_port = htons(3779);  
  125.     sin.sin_addr.s_addr = 0;  
  126.   
  127.     // 用来从网络上的广播地址接收数据  
  128.     SOCKADDR_IN sin_from;  
  129.     sin_from.sin_family = AF_INET;  
  130.     sin_from.sin_port = htons(3779);  
  131.     sin_from.sin_addr.s_addr = INADDR_BROADCAST;  
  132.   
  133.     //设置该套接字为广播类型,  
  134.     bool bOpt = true;  
  135.     setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  
  136.   
  137.     // 绑定套接字  
  138.     err = bind(connect_socket, (SOCKADDR*)&sin, sizeof(SOCKADDR));  
  139.     if(SOCKET_ERROR == err)  
  140.     {  
  141.         err = WSAGetLastError();  
  142.         printf("/"bind/" error! error code is %d/n", err);  
  143.         return -1;  
  144.     }  
  145.   
  146.     int nAddrLen = sizeof(SOCKADDR);  
  147.     char buff[MAX_BUF_LEN] = "";  
  148.     int nLoop = 0;  
  149.     while(1)  
  150.     {  
  151.         // 接收数据  
  152.         int nSendSize = recvfrom(connect_socket, buff, MAX_BUF_LEN, 0, (SOCKADDR*)&sin_from, &nAddrLen);  
  153.         if(SOCKET_ERROR == nSendSize)  
  154.         {  
  155.             err = WSAGetLastError();  
  156.             printf("/"recvfrom/" error! error code is %d/n", err);  
  157.             return -1;  
  158.         }  
  159.         buff[nSendSize] = '/0';  
  160.         printf("Recv: %s/n", buff);  
  161.     }  
  162.   
  163.     return 0;  
  164. }  

你可能感兴趣的:(正确使用UDP广播(C++代码))