<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Linux系統下UDP發送和接收廣播消息小例子

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 [cpp] view plaincopy  
    1. // 發送端  
    2. #include <iostream>  
    3. #include <stdio.h>  
    4. #include <sys/socket.h>  
    5. #include <unistd.h>  
    6. #include <sys/types.h>  
    7. #include <netdb.h>  
    8. #include <netinet/in.h>  
    9. #include <arpa/inet.h>  
    10. #include <string.h>  
    11.   
    12.   
    13. using namespace std;  
    14.   
    15. int main()  
    16. {  
    17.     setvbuf(stdout, NULL, _IONBF, 0);   
    18.     fflush(stdout);   
    19.   
    20.     int sock = -1;  
    21.     if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)   
    22.     {     
    23.         cout<<"socket error"<<endl;   
    24.         return false;  
    25.     }     
    26.       
    27.     const int opt = 1;  
    28.     //設置該套接字為廣播類型,  
    29.     int nb = 0;  
    30.     nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));  
    31.     if(nb == -1)  
    32.     {  
    33.         cout<<"set socket error..."<<endl;  
    34.         return false;  
    35.     }  
    36.   
    37.     struct sockaddr_in addrto;  
    38.     bzero(&addrto, sizeof(struct sockaddr_in));  
    39.     addrto.sin_family=AF_INET;  
    40.     addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);  
    41.     addrto.sin_port=htons(6000);  
    42.     int nlen=sizeof(addrto);  
    43.   
    44.     while(1)  
    45.     {  
    46.         sleep(1);  
    47.         //從廣播地址發送消息  
    48.         char smsg[] = {"abcdef"};  
    49.         int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);  
    50.         if(ret<0)  
    51.         {  
    52.             cout<<"send error...."<<ret<<endl;  
    53.         }  
    54.         else  
    55.         {         
    56.             printf("ok ");    
    57.         }  
    58.     }  
    59.   
    60.     return 0;  
    61. }  

     

    [cpp] view plaincopy  
    1. // 接收端 http://blog.csdn.net/robertkun  
    2.   
    3. #include <iostream>  
    4. #include <stdio.h>  
    5. #include <sys/socket.h>  
    6. #include <unistd.h>  
    7. #include <sys/types.h>  
    8. #include <netdb.h>  
    9. #include <netinet/in.h>  
    10. #include <arpa/inet.h>  
    11. #include <string.h>  
    12.   
    13.   
    14. using namespace std;  
    15.   
    16. int main()  
    17. {  
    18.     setvbuf(stdout, NULL, _IONBF, 0);   
    19.     fflush(stdout);   
    20.   
    21.     // 綁定地址  
    22.     struct sockaddr_in addrto;  
    23.     bzero(&addrto, sizeof(struct sockaddr_in));  
    24.     addrto.sin_family = AF_INET;  
    25.     addrto.sin_addr.s_addr = htonl(INADDR_ANY);  
    26.     addrto.sin_port = htons(6000);  
    27.       
    28.     // 廣播地址  
    29.     struct sockaddr_in from;  
    30.     bzero(&from, sizeof(struct sockaddr_in));  
    31.     from.sin_family = AF_INET;  
    32.     from.sin_addr.s_addr = htonl(INADDR_ANY);  
    33.     from.sin_port = htons(6000);  
    34.       
    35.     int sock = -1;  
    36.     if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)   
    37.     {     
    38.         cout<<"socket error"<<endl;   
    39.         return false;  
    40.     }     
    41.   
    42.     const int opt = 1;  
    43.     //設置該套接字為廣播類型,  
    44.     int nb = 0;  
    45.     nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));  
    46.     if(nb == -1)  
    47.     {  
    48.         cout<<"set socket error..."<<endl;  
    49.         return false;  
    50.     }  
    51.   
    52.     if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1)   
    53.     {     
    54.         cout<<"bind error..."<<endl;  
    55.         return false;  
    56.     }  
    57.   
    58.     int len = sizeof(sockaddr_in);  
    59.     char smsg[100] = {0};  
    60.   
    61.     while(1)  
    62.     {  
    63.         //從廣播地址接受消息  
    64.         int ret=recvfrom(sock, smsg, 100, 0, (struct sockaddr*)&from,(socklen_t*)&len);  
    65.         if(ret<=0)  
    66.         {  
    67.             cout<<"read error...."<<sock<<endl;  
    68.         }  
    69.         else  
    70.         {         
    71.             printf("%s\t", smsg);     
    72.         }  
    73.   
    74.         sleep(1);  
    75.     }  
    76.   
    77.     return 0;  
    78. }  


    自已在Linux虛擬機下測試可以成功, 前提是要把主機設置在同一網段內, 還有就是不要忘記關閉Linux的防火墻.. 可以使用setup命令進行設置。

    (我在測試的時候只能發送不收接收,折磨了我半天,后來才想到是Linux防火墻的問題。。)

     

    關于虛擬機的網卡配置,建議選擇橋接模式。NAT的模式的話,是受限制的,可能會收不到廣播消息。

    具體的參考網上的文章吧。。

    祝你成功。。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全