5 AT组件 socket 阻塞

发布于 2020-11-04 02:01:32

stm405 ;rt-thread studio 1.1.5; at-2.03 ; rt-thread 4.02,中移物联的M6315模组,才用TCP通讯


//当没有数据时的时候recv会阻塞住,
int grps_socket_recv(int sockfd, uint8_t *buf, int len, int flags)
{
    int ret = -1;

    ret = recv(sockfd, buf, len - 1, flags);

    if (ret <= 0)
    {
        rt_kprintf("--->[Error] receive error, socket <%d>.\r\n", sockfd);
    }
}


//当没有数据时的时候recv不会阻塞住,但是读不出数据
int grps_socket_recv(int sockfd, uint8_t *buf, int len, int flags)
{
    fd_set readset;
    int i=0, maxfdp1;
    int ret = -1;
    struct timeval timeout;
    
    //maxfdp1 = sockfd + 1;
    maxfdp1 = m6315->device.client->device->device_id + 1;

    timeout.tv_sec=3;
    timeout.tv_usec=0;
    
    while(1)
    {
        // 清空可读事件描述符列表
        FD_ZERO(&readset);

        // 将需要监听可读事件的描述符加入列表
        FD_SET(m6315->device.client->device->device_id , &readset);

        // 等待设定的网络描述符有事件发生
        ret = select(maxfdp1, &readset, 0, 0, &timeout);

        // 至少有一个文件描述符有指定事件发生再向后运行
        //if (ret == 0) break; //continue;
        if (ret == 1) continue;

        if (ret < 0 ) break;
        
        // 查看 sockfd 描述符上有没有发生可读事件
        if (FD_ISSET(m6315->device.client->device->device_id , &readset))
        {
            // 从sock连接中接收最大BUFSZ - 1字节数据
            ret = recv(sockfd, buf, len - 1, 0);
            if (ret < 0)
            {
                // 接收失败,关闭这个连接
                //closesocket(sockfd);
                rt_kprintf("\nreceived error,close the socket.\r\n");

                // 释放接收缓冲
                //rt_free(recv_data);
                break;
            }
            else if (ret == 0)
            {
                // 默认 recv 为阻塞模式,此时收到0认为连接出错,关闭这个连接
                //closesocket(sockfd);
                rt_kprintf("\nreceived error,close the socket.\r\n");

                // 释放接收缓冲
                //rt_free(recv_data);
                break;
            }
            else 
            {
                printf_byte_buffer(" grps_socket_recv", buf, ret);
                break;
            }
        }
        rt_thread_mdelay(10);
    }
    
    return ret;
}

请教一下如何才能不阻塞,还能收到数据

查看更多

关注者
0
被浏览
289
2 个回答
piaoxueboy
piaoxueboy 2020-11-04

您推荐的文章,我当时研究过,对比过,文章中,多了一个管道,如果取掉管道,现象和我的一样,select总是返回0,回调函数不会被调用

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览