Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
lwip2.02
socket
lwip socket重新连接无法连接问题?
发布于 2024-04-22 15:58:22 浏览:842
订阅该版
[tocm] # 一、基础描述 硬件没有问题,此前得方案是freertos+lwip+socket,服务端能够满足多客户端得连接 目前改为使用RTT-STUDIO。 # 二、现象 板子作为服务端使用,电脑助手模拟客户端,目前多客户端连接没有问题。但是客户端断开某个连接之后再次连接无法连接上,等待几分钟不等的时间就能连接上了。如果是新的客户端(即端口号发生了变化)立马能连的上。使用如下图所示助手, ![捕获.JPG](https://oss-club.rt-thread.org/uploads/20240422/0ff78d355adf40bc1506e759e89edd9a.jpg.webp) 三、代码 代码中一些setsockopt函数均为尝试设置wait time等做出修改,结果都是无效。 ```c void free_mem_task(char number) { if (tcp_remote_clientad.state[number]) { printf("--%d# connected is del\r\n", tcp_remote_clientad.state[number]); if (tcp_remote_clientad.state[number] != 0) { // setsockopt(tcp_remote_clientad.state[number], SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)); if (closesocket(tcp_remote_clientad.state[number]) == 0) { printf("close socket success\r\n"); } // shutdown(tcp_remote_clientad.state[number],SHUT_RDWR ); } // tcp_remote_clientad.connected_num--; tcp_remote_clientad.state[number] = 0; // 将该序号的连接清零 rt_thread_delete(tcp_remote_clientad.Client_RX_Task_Handle[number]); // 删除AppTaskCreate任务 // printf("--tcp_tx_%d memory is free \r\n",number); rt_thread_delete(tcp_remote_clientad.Client_TX_Task_Handle[number]); // 删除AppTaskCreate任务 // xSemaphoreTake(Semaphore_TX[number], 0); //将删除的任务等待的信号量清零 if (tcp_remote_clientad.rx_data[number]) rt_free(tcp_remote_clientad.rx_data[number]); if (tcp_remote_clientad.tx_data[number]) rt_free(tcp_remote_clientad.tx_data[number]); } } // 客户端删除任务 void client_del_Task(void *parameter) { // BaseType_t xResult; char num; uint32_t client_task_id = 0; while (1) { if (rt_mb_recv(&mb_1, &client_task_id, RT_WAITING_FOREVER) == RT_EOK) { rt_kprintf("client delete task: get a mail from mailbox, the content:%d\n", client_task_id); free_mem_task(client_task_id); } rt_thread_mdelay(100); } } ``` ```c void tcpserv(void *parameter) { char *recv_data; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */ socklen_t sin_size; int connected, bytes_received; struct sockaddr_in server_addr, client_addr; rt_bool_t stop = RT_FALSE; /* 停止标志 */ int ret; recv_data = rt_malloc(BUFSZ + 1); /* 分配接收用的数据缓冲 */ if (recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; } rt_kprintf("tcp server task start\r\n"); /* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* 创建失败的错误处理 */ rt_kprintf("Socket error\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; } struct linger opt = {1, 10}; if (setsockopt(sock, SOL_SOCKET, SO_LINGER, &opt, sizeof(opt)) != 0) { rt_kprintf("so_linger set ok \n"); } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) != 0) { rt_kprintf("SO_REUSEADDR set ok \n"); } char bDontLinger = 0; setsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (const char *)&bDontLinger, sizeof(char)); /* 初始化服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8123); /* 服务端工作的端口 */ server_addr.sin_addr.s_addr = INADDR_ANY; rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 绑定socket到服务端地址 */ if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 绑定失败 */ rt_kprintf("Unable to bind\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; } /* 在socket上进行监听 */ if (listen(sock, 5) == -1) { rt_kprintf("Listen error\n"); /* release recv buffer */ rt_free(recv_data); return; } // 将socket设置为非阻塞模式 // int flags = fcntl(sock, F_GETFL, 0); // fcntl(sock, F_SETFL, flags | O_NONBLOCK); rt_kprintf("\nTCPServer Waiting for client on port 5000...\n"); create_tcp_remote_client_close_task(); // 创建远端客户端删除任务 while (stop != RT_TRUE) { uint32_t client_task_id; // if (rt_mb_recv(&mb_1, &client_task_id, 100) == RT_EOK) // { // rt_kprintf("client delete task: get a mail from mailbox, the content:%d\n", client_task_id); // free_mem_task(client_task_id); // } rt_kprintf("tcp server task run\r\n"); sin_size = sizeof(struct sockaddr_in); /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */ connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); /* 返回的是连接成功的socket */ if (connected < 0) { rt_kprintf("accept connection failed! errno = %d\n", errno); rt_thread_mdelay(100); continue; } /* 接受返回的client_addr指向了客户端的地址信息 */ rt_kprintf("new connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 不等待 TIME_WAIT 时间的情况下立即关闭 socket。 // struct linger opt = {1, 10}; // setsockopt(connected, SOL_SOCKET, SO_LINGER, &opt, sizeof(opt)); if (setsockopt(connected, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) != 0) { rt_kprintf("connected SO_REUSEADDR set ok \n"); } setsockopt(connected, SOL_SOCKET, SO_DONTLINGER, (const char *)&bDontLinger, sizeof(char)); int flag = 1; // 设置TCP相关 flag = 1; // 设置keepalive // setsockopt(connected, SOL_SOCKET, SO_KEEPALIVE, &flag, sizeof(int)); create_tcp_remote_client_thread(connected); rt_thread_mdelay(10); } ```
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
842
关于作者
letchgo
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
W5500 如何实现断开重连?
2
AT组件连接BC26并使用Webclient软件包GET方式请求失败
3
Posix Socket采用select机制最多能监听多少个Socket
4
socket第三个参数无效
5
添加SAL组件后socket相关函数均提示declared implicitly
6
mqtt pipe 里面使用到了dfs, socket 是怎么关联起来dfs的?
7
socket应用方案选择
8
closesocket函数调用会阻塞
9
基于AT Socket的测速工具
10
关于网络编程socket
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部