linux下基於UDP的廣播通信

2022-08-18


場景

存在兩個角色,一個是“發佈者”,另一個是“訂閱者”。雙方均處於同一局域網。發佈者定時向局域網內所有主機發布消息,訂閱者負責接收這一消息。

 

實現

在linux環境下,使用C語言基於UDP的廣播來實現是最便捷的。並且在同一局域網內幾乎不用擔心UDP的通信可靠性問題。

 

發佈者示例程序

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>

int main()
{
    printf("hello world\n");
    struct sockaddr_in sin;
    int sfd;

    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    printf("UDP socket fd:%d\n", sfd);

    int sb = 1;
    int ret = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &sb, sizeof(int)); //打開廣播通信的權限
    printf("set sock opt ret:%d\n", ret);

    memset(&sin, 0, sizeof(struct sockaddr_in));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8611); //通信端口號。發佈者與訂閱者必須一致。
    sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    printf("config IP-address success\n");

    char* words = "hi there\n";
    int slen;
    while(1)
    {
        slen = sendto(sfd, words, strlen(words), 0, (struct sockaddr*)&sin, sizeof(sin));
        printf("%s sent %d\n", words, slen);
        sleep(3);
    }

    return 0;
}

 

 

訂閱者示例程序

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>

int main()
{
    struct sockaddr_in sin;
    int sfd;
    int ret;

    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    printf("socket fd:%d\n", sfd);

    int sb = 1;
    ret = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &sb, sizeof(int)); //The permission
    printf("set sock opt ret:%d\n", ret);

    sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); //255.255.255.255
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8611); //Very important

    ret = bind(sfd, (struct sockaddr*)&sin, sizeof(sin));
    printf("bind ret:%d\n", ret);

    char rbuf[256];
    int rlen;
    while(1)
    {
            rlen = recvfrom(sfd, rbuf, 255, 0, NULL, NULL);
            rbuf[rlen] = 0;
            printf("rlen:%d, %s\n", rlen, rbuf);
    }

    return 0;
}

 


 

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