본문 바로가기
Raspberry Pi (Linux, ubuntu)

UDP socket , Broadcast send

by 소나무기운 2022. 3. 8.
반응형

[2022/04/06] Add title image

[2022/03/58] First Edit

 

소나무 기운 ,  전자제품 개발/생산

UDP socket , Broadcast send

 

UDP

serv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

SOCK_DGRAM, IPPROTO_UDP

 

Broadcast

if (setsockopt(serv_sock, SOL_SOCKET, SO_BROADCAST, (const char *)&fBroadcatOpt, sizeof(fBroadcatOpt)) < 0)

SO_BROADCAST

 

example

    uint8_t bySendBuf[44] = {0};

    int fBroadcatOpt = 1;

    // fifo init
    ThreadINFO_Init();

    while (1)
    {
        LOG_DEBUG("trying: socket...\n");
        serv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (serv_sock < 0)
        {
            LOG_DEBUG("INFO socket() error");
            error_handlingINFO("INFO socket() error");
        }

        LOG_DEBUG("trying: setsockopt...\n");
        if (setsockopt(serv_sock, SOL_SOCKET, SO_BROADCAST, (const char *)&fBroadcatOpt, sizeof(fBroadcatOpt)) < 0)
        {
            LOG_DEBUG("INFO setsockopt() error");
            error_handlingINFO("INFO setsockopt() error");

            if (close(serv_sock) < 0)
            {
                LOG_DEBUG("INFO close() error");
                error_handlingINFO("INFO close() error");
            }
        }

        /* I want to get an IPv4 IP address */
        ifr.ifr_addr.sa_family = AF_INET;

        /* I want IP address attached to "eth0" */
        strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);

        ioctl(serv_sock, SIOCGIFADDR, &ifr);

        /* display result */
        printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));

        memset(&serv_addr, 0, sizeof(serv_addr)); // initialize the variable
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
        serv_addr.sin_port = htons(g_tDevCfg.nPortINFO);

        // 1초마다 한번씩 데이터 보내기
        while (1)
        {
            sleep(0.7); // 0.7초 대기
            // 데이터 만들기
            ThreadINFO_MakeData(&bySendBuf[0]);
            // 데이터 보내기
            // printf("trying: sendto...\n");

            if (sendto(serv_sock, bySendBuf, sizeof(bySendBuf), 0, (const struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) < 0)
            {
                LOG_DEBUG("INFO sendto() error");
                error_handlingINFO("INFO sendto() error");

                if (close(serv_sock) < 0)
                {
                    LOG_DEBUG("INFO close() error");
                    error_handlingINFO("INFO close() error");
                    break;
                }
            }
        }

        printf("trying: close...\n");
        if (close(serv_sock) < 0)
        {
            LOG_DEBUG("INFO losesocket() error");
            error_handlingINFO("INFO losesocket() error");
        }

        LOG_DEBUG("END");
    }

 

 

마무리

 

 

 

참고문헌

 

 

 

 

틀린 부분이나 질문은 댓글 달아주세요.

즐거운 하루 보내세요. 감사합니다.

 

 

반응형

댓글