The socket is listening on all addresses (broadcast)

qaqa85
Posts: 1
Joined: Thu May 27, 2021 4:45 pm

The socket is listening on all addresses (broadcast)

Postby qaqa85 » Fri May 28, 2021 7:51 pm

AT version:2.2.0.0-dev(3241d23 - ESP8266 - Mar 12 2021 07:09:37)
SDK version:v3.4-dirty
compile time(40b17c0):May 28 2021 12:21:41
Bin version:2.0.0 - (ESP8266_1MB)


Hi, i got a little problem. I want to listen via socket UDP server when ESP is connected to AP but it didnt get address from DHCP (waiting for DHCP server to obtain an address).
The socket is supposed to listen broadcast messages. It's possible to make it with AT-IDF?

As socket UDP server i used this example. Its works fine when esp can obtain address from DHCP.

Code: Select all

static void udp_server_task(void *pvParameters)
{
    char rx_buffer[128];
    char addr_str[128];
    int addr_family;
    int ip_protocol;

    while (1) {

#ifdef CONFIG_EXAMPLE_IPV4
        struct sockaddr_in destAddr;
        destAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        destAddr.sin_family = AF_INET;
        destAddr.sin_port = htons(PORT);
        addr_family = AF_INET;
        ip_protocol = IPPROTO_IP;
        inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1);
#else // IPV6
        struct sockaddr_in6 destAddr;
        bzero(&destAddr.sin6_addr.un, sizeof(destAddr.sin6_addr.un));
        destAddr.sin6_family = AF_INET6;
        destAddr.sin6_port = htons(PORT);
        addr_family = AF_INET6;
        ip_protocol = IPPROTO_IPV6;
        inet6_ntoa_r(destAddr.sin6_addr, addr_str, sizeof(addr_str) - 1);
#endif

        int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
        if (sock < 0) {
            ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
            break;
        }
        ESP_LOGI(TAG, "Socket created");

        int err = bind(sock, (struct sockaddr *)&destAddr, sizeof(destAddr));
        if (err < 0) {
            ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno);
        }
        ESP_LOGI(TAG, "Socket binded");

        while (1) {

            ESP_LOGI(TAG, "Waiting for data");
#ifdef CONFIG_EXAMPLE_IPV6
            struct sockaddr_in6 sourceAddr; // Large enough for both IPv4 or IPv6
#else
            struct sockaddr_in sourceAddr;
#endif
            socklen_t socklen = sizeof(sourceAddr);
            int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&sourceAddr, &socklen);

            // Error occured during receiving
            if (len < 0) {
                ESP_LOGE(TAG, "recvfrom failed: errno %d", errno);
                break;
            }
            // Data received
            else {
                // Get the sender's ip address as string
#ifdef CONFIG_EXAMPLE_IPV6
                if (sourceAddr.sin6_family == PF_INET) {
                    inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
                } else if (sourceAddr.sin6_family == PF_INET6) {
                    inet6_ntoa_r(sourceAddr.sin6_addr, addr_str, sizeof(addr_str) - 1);
                }
#else
                inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
#endif

                rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string...
                ESP_LOGI(TAG, "Received %d bytes from %s:", len, addr_str);
                ESP_LOGI(TAG, "%s", rx_buffer);

                int err = sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&sourceAddr, sizeof(sourceAddr));
                if (err < 0) {
                    ESP_LOGE(TAG, "Error occured during sending: errno %d", errno);
                    break;
                }
            }
        }

        if (sock != -1) {
            ESP_LOGE(TAG, "Shutting down socket and restarting...");
            shutdown(sock, 0);
            close(sock);
        }
    }
    vTaskDelete(NULL);
}

Her Mary
Posts: 537
Joined: Mon Oct 27, 2014 11:09 am

Re: The socket is listening on all addresses (broadcast)

Postby Her Mary » Thu Jun 03, 2021 11:32 am

I thought esp-at already supports UDP broadcast, doesn't it? https://github.com/espressif/esp-at

Who is online

Users browsing this forum: No registered users and 186 guests