完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件中有一个EC200X的CAT1,按照tcpclient_sample的示例代码,调用recv函数,示例代码中默认是阻塞接收。程序中没有使用lwip,用的是EC200X软件包at device,数据收发都已经正常实现。 recv函数中flags传参是0 按照示例flags传入0阻塞接收,程序运行没有问题,但是将flags传入MSG_DONTWAIT,希望实现非阻塞接收。 程序直接运行出错,但是服务器命名返回了一个数据包,采用非阻塞接收时并没有接收到这个数据包而是直接返回-1或者0, 请问MSG_DONTWAIT这个非阻塞标志函数能使recv非阻塞接收吗? |
|
相关推荐
1个回答
|
|
非阻塞方式下对于返回结果的处理应该不同,不能照搬阻塞方式下的处理。 操作系统下使用阻塞方式编程逻辑更为清析,如不想直到有数据才返回,可以配置socket超时时间,实现达到超时返回。示例如下: 超时配置: const struct timeval tv = {30, 0}; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 接收处理: bytes_received = recv(sock, recv_data, BUFSZ, 0); if (bytes_received < 0) { rt_kprintf("Receive timeout!n"); continue; } if (bytes_received == 0) { rt_kprintf("Receive error!n"); rt_free(recv_data); closesocket(sock); return; } recv_data[bytes_received] = ' |