|
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);
}
}
|
|