广播通信

来源:互联网 发布:wifi直连软件 编辑:程序博客网 时间:2024/05/25 20:00

广播通信代码框架:

1. 协议都是:

[python] view plaincopyprint?
  1. SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);  

2. 服务端设置选项

[python] view plaincopyprint?
  1. BOOL bBroadcast = TRUE;  
  2. ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));  
3. 服务端向255.255.255.255 这个广播地址发内容  客户端收听就可以了

服务端代码:

[python] view plaincopyprint?
  1. #include "InitSock.h"  
  2. #include <stdio.h>  
  3.   
  4. VOID main()  
  5. {  
  6.     CInitSock initSock;  
  7.   
  8.     SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);  
  9.     //设置广播就是设置这个选项  
  10.     BOOL bBroadcast = TRUE;  
  11.     ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));  
  12.   
  13.     //设置广播地址  
  14.     SOCKADDR_IN bcast;  
  15.     bcast.sin_family = AF_INET;  
  16.     bcast.sin_port = htons(4567);  
  17.     bcast.sin_addr.S_un.S_addr = INADDR_BROADCAST; //::inet_addr("255.255.255.255");  
  18.     printf("begin send the data:\r\n");  
  19.     char sz[] = "this is the broadcast data";  
  20.     while(TRUE)  
  21.     {  
  22.         ::sendto(s, sz, sizeof(sz), 0, (sockaddr*)&bcast, sizeof(bcast));  
  23.         ::Sleep(5000);  
  24.     }  
  25. }  
客户端代码:

[python] view plaincopyprint?
  1. #include "InitSock.h"  
  2. #include <stdio.h>  
  3.   
  4. VOID main()  
  5. {  
  6.     CInitSock initSock;  
  7.   
  8.     SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);  
  9.   
  10.     SOCKADDR_IN sin;   
  11.     sin.sin_family = AF_INET;  
  12.     sin.sin_port = ::htons(4567);  
  13.     sin.sin_addr.S_un.S_addr = INADDR_ANY;  
  14.     if (::bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)  
  15.     {  
  16.         printf("bind error");  
  17.         return;  
  18.     }  
  19.   
  20.     printf("begin recv the broadcast data:\r\n");  
  21.     char sz[256] = {0};  
  22.     SOCKADDR_IN addrRemote;  
  23.     int nLen = sizeof(SOCKADDR_IN); //这里必须设置成这个大小   
  24.     while (TRUE)  
  25.     {  
  26.         int nRet = ::recvfrom(s, sz, sizeof(sz), 0, (sockaddr*)&addrRemote, &nLen);  
  27.         if (nRet > 0)  
  28.         {  
  29.             sz[nRet] = '\0';  
  30.             printf(sz);  
  31.         }  
  32.   
  33.     }  
  34. }  

原创粉丝点击