硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1937|回复: 2
收起左侧

LWIP SOCKET UDP 如何创建非阻塞发送及接收程序

[复制链接]

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2024-6-26 09:08:38 | 显示全部楼层 |阅读模式


lwip socket udp 创建的发送及接收默认为阻塞模式。请问各位 如何创建非阻塞模式的发送及接收。

void lwip_data_send(void)
{
    sys_thread_new("lwip_send_thread", lwip_send_thread, NULL, 512, LWIP_SEND_THREAD_PRIO );
}

void lwip_demo(void)
{
    BaseType_t lwip_err;
    char *tbuf;  int nonblock = 1;
    lwip_data_send();                                   /* 创建发送数据线程 */
    memset(&local_info, 0, sizeof(struct sockaddr_in)); /* 将服务器地址清空 */
    local_info.sin_len = sizeof(local_info);            /* 计算Socket地址信息结构体长度 */
    local_info.sin_family = AF_INET;                    /* IPv4地址 */
    local_info.sin_port = htons(LWIP_DEMO_PORT);        /* 设置端口号 */
    local_info.sin_addr.s_addr = htons(INADDR_ANY);     /* 设置本地IP地址 */

    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           /* 建立一个新的socket连接 协议族 指定socket类型 指定使用的协议 */
    tbuf = mymalloc(SRAMIN, 200); /* 申请内存 */
    sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);    /* 客户端端口号 */

    bind(sock_fd, (struct sockaddr *)&local_info, sizeof(struct sockaddr_in)); /* 建立绑定 */

    while (1)
    {
        memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));
        recv(sock_fd, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0);
        lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);
        if (lwip_err == errQUEUE_FULL)
        {
            printf("队列Key_Queue已满,数据发送失败!\r\n");
        }
    }
}

/**
* @brief       发送数据线程函数
*/
void lwip_send_thread(void *pvParameters)
{
    pvParameters = pvParameters;
     BaseType_t lwip_err;   
    local_info.sin_addr.s_addr = inet_addr(IP_ADDR);                /* 需要发送的远程IP地址 */

    while (1)
    {
        if((g_lwip_send_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA)     /* 有数据要发送 */
        {
            sendto(sock_fd,                                         /* scoket */
                  (char *)g_lwip_demo_sendbuf,                        /* 发送的数据 */
                  sizeof(g_lwip_demo_sendbuf), 0,                     /* 发送的数据大小 */
                  (struct sockaddr *)&local_info,                   /* 接收端地址信息 */
                  sizeof(local_info));                              /* 接收端地址信息大小 */

            g_lwip_send_flag &= ~LWIP_SEND_DATA;
        }

        vTaskDelay(100);
     }
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-6-26 16:04:57 | 显示全部楼层
这个是rtx5全家桶的,lwip应该也有类似设置,可以立即返回状态

下载 (1).png
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-7-1 09:12:34 | 显示全部楼层
eric2013 发表于 2024-6-26 16:04
这个是rtx5全家桶的,lwip应该也有类似设置,可以立即返回状态

多谢 我在看看,怎么设置
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 03:41 , Processed in 0.040320 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表