广播

只有通过UDP套接字才能实现广播和多播。

 

报文的发送

在默认情况下,UPD套接字是无法发送广播报文的,套接字启用/禁止广播是通过SOL_SOCKET->SO_BROADCAST选项来完成的。

下面代码,可以确认广播选项是默认关闭的:

  1. BOOL bBroadcast; 
  2. int optlen = sizeof(bBroadcast); 
  3. if(SOCKET_ERROR==getsockopt(sock,SOL_SOCKET,SO_BROADCAST, 
  4.                             (char*)&bBroadcast,&optlen)) 
  5.     HandleError("getsockopt"); 
  6.     closesocket(sock); 
  7.     WSACleanup(); 
  8.     return -1; 
  9. if(bBroadcast) 
  10.     printf("广播默认打开\n"); 
  11. else 
  12.     printf("广播默认关闭\n"); 

输出为 默认关闭,因此要发生广播报文,必须首先启用SO_BROADCAST选项,如下:

  1. bBroadcast = TRUE; 
  2. optlen = sizeof(bBroadcast); 
  3. if(SOCKET_ERROR==setsockopt(sock,SOL_SOCKET,SO_BROADCAST, 
  4.                             (char*)&bBroadcast,optlen)) 
  5.     HandleError("setsockopt"); 
  6.     closesocket(sock); 
  7.     WSACleanup(); 
  8.     return -1; 

此时仍然可以调用getsockopt函数检查是否设置成功,成功的设置了SO_BROADCAST后,就可以发送广播报文了

  1. SOCKADDR_IN addr; 
  2. memset(&addr,0,sizeof(SOCKADDR_IN)); 
  3. addr.sin_family=AF_INET; 
  4. addr.sin_port=htons(5050); 
  5. addr.sin_addr.s_addr=INADDR_BROADCAST; 
  6.  
  7. const char* msg="Hello! Broadcast Test"
  8. int len = strlen(msg); 
  9.  
  10. if(SOCKET_ERROR==sendto(sock,msg,len,0, 
  11.                        (SOCKADDR*)&addr,sizeof(SOCKADDR_IN))) 
  12.     HandleError("sendto"); 
  13.     closesocket(sock); 
  14.     WSACleanup(); 
  15.     return -1; 

winsock定义常量0xffffffff,对应于受限广播地址255.255.255.255。

 

广播报文的接收

  1. SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); 
  2. SOCKADDR_IN addr; 
  3. memset(&addr,0,sizeof(SOCKADDR_IN)); 
  4. addr.sin_family=AF_INET; 
  5. addr.sin_port=htons(5050); 
  6. addr.sin_addr.s_addr=INADDR_ANY; 
  7. bind(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); 
  8. int ret; 
  9. char buf[5000]; 
  10. while(TRUE) 
  11.     ret=recvfrom(sock,buf,5000,0,NULL,NULL); 
  12.     if(SOCKET_ERROR==ret) 
  13.     { 
  14.         printf("recvfrom:%d\n",WSAGetLastError()); 
  15.         break
  16.     } 
  17.     else 
  18.     { 
  19.         printf("recvd %d bytes\n", ret); 
  20.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章