廣播

只有通過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.     } 

 

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