高级会员
- 积分
- 600
- 金钱
- 600
- 注册时间
- 2015-9-7
- 在线时间
- 140 小时
|
1金钱
本帖最后由 wt13568089592 于 2024-9-2 01:23 编辑
求教LWIP connect函数一直阻塞问题
当tcp服务器没有开的时候connect函数会一直阻塞,如果后面tcp服务器已开启会连不上服务器,有没有办法设置超时呢?当使用了 ioctlsocket(g_lwip_sock,FIONBIO,&block); //设置为非阻塞模式 connect会返回-1,实际上已经连接成功,但是怎么去判断是否成功呢?
void lwip_demo(void)
{
struct sockaddr_in atk_client_addr;
err_t err;
int recv_data_len;
BaseType_t lwip_err;
char *tbuf;
int block = 1;
lwip_data_send(); /* 创建发送数据线程 */
while (1)
{
sock_start:
printf("TCP开始连接中\r\n");
g_lwip_sock = socket(AF_INET, SOCK_STREAM, 0); /* 可靠数据流交付服务既是TCP协议 */
setsockopt(g_lwip_sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
g_lwip_connect_state = 0;
atk_client_addr.sin_family = AF_INET; /* 表示IPv4网络协议 */
atk_client_addr.sin_port = htons(LWIP_DEMO_PORT); /* 端口号 */
atk_client_addr.sin_addr.s_addr = inet_addr(IP_ADDR); /* 远程IP地址 */
memset(&(atk_client_addr.sin_zero), 0, sizeof(atk_client_addr.sin_zero));
ioctlsocket(g_lwip_sock,FIONBIO,&block); //设置为非阻塞模式
// tbuf = mymalloc(SRAMIN, 200); /* 申请内存 */
// sprintf((char *)tbuf, "ort:%d", LWIP_DEMO_PORT); /* 客户端端口号 */
// disp_show_string(5, 150, 200, 16, 16, tbuf, CC);
printf("TCP尝试连接中\r\n");
/* 连接远程IP地址 */
err = connect(g_lwip_sock, (struct sockaddr *)&atk_client_addr, sizeof(struct sockaddr));
printf("TCP连接结束\r\n");
if (err == -1)
{
printf("连接失败\r\n");
g_lwip_sock = -1;
closesocket(g_lwip_sock);
// myfree(SRAMIN, tbuf);
vTaskDelay(1000);
goto sock_start;
}
printf("连接成功\r\n");
// disp_show_string(5, 90, 200, 16, 16, "State:Connection Successful", CC);
g_lwip_connect_state = 1;
while (1)
{
recv_data_len = recv(g_lwip_sock,g_lwip_demo_recvbuf,
LWIP_DEMO_RX_BUFSIZE,0);
if (recv_data_len <= 0 )
{
printf("网络数据接收错误\r\n");
closesocket(g_lwip_sock);
g_lwip_sock = -1;
// lcd_fill(5, 89, lcddev.width,110, WHITE);
// disp_show_string(5, 90, 200, 16, 16, "Stateisconnect", CC);
// myfree(SRAMIN, tbuf);
goto sock_start;
}
/* 接收的数据 */
// lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);
// printf("%s",&g_lwip_demo_recvbuf);
if (lwip_err == errQUEUE_FULL)
{
printf("Key_Queue fault!\r\n");
// printf("队列Key_Queue已满,数据发送失败!\r\n");
}
vTaskDelay(10);
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
在您的代码中,您尝试将套接字设置为非阻塞模式,然后调用 `connect` 函数。在非阻塞模式下,如果连接无法立即建立,`connect` 将返回 `-1` 并设置错误号为 `EINPROGRESS`。这意味着连接操作已经开始,但尚未完成。在这种情况下,您需要检查连接状态以确定连接是否成功。
为了实现这一点,您可以使用 `select` 或 `poll` 函数来轮询套接字的状态,直到连接成功或者超时为止。下面是一个示例代码片段,展示如何实现这一功能:
...
|