Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于TCP异常断开(拔网线),重连时间的问题!
发布于 2013-11-15 18:18:28 浏览:7637
订阅该版
连接方式:板子(107vc+dp83848_rtt+lwip)——交换机——电脑 tcp连接配置: 电脑:tcp服务器 板子:tcp客户端(程序中:tcp断开后立刻关闭sock,然后重新建立sock,并且connect) 问题1:拔掉交换机和电脑的网线,再插上。。。板子重连电脑得需要3-9秒时间不等,这样正常嘛? 问题2:这么长的时间是3次握手的时间?还是板子phy和电脑phy的检测连接时间? 个人感觉太长了吧。。。 以下贴出代码,tcp处理部分的C文件:```#include
#include
/* 为了解析主机名,需要包含netdb.h头文件 */ #include
/* 使用BSD socket,需要包含sockets.h头文件 */ #include "andy_app_init.h" #include "app_tcp_manage.h" //***********************************TCP控制相关***********************************// //tcp_client套接字相关 static rt_uint16_t try_to_count = 0; //尝试重新连接的次数 static rt_int16_t tcp_client_sock = -1; //全局sock,因为仅工作于TCP客户端模式 static struct rt_mutex tcp_sock_mutex; //TCP互斥量,暂时未用 static unsigned char alive_flag=0; //在线标志 ,暂时未用 //tcp_client接收相关 #define RECV_TIMEOUT 500 //设定select函数超时时间,500ms都没有准备好超时返回 #define MAX_TCP_RBUF 1024 //TCP接收最大缓存字节数 char tcp_recv_buf[MAX_TCP_RBUF]; //tcp_client发送相关 struct rt_messagequeue tcp_tx_mq; //rfid发送_消息队列控制块 char tcp_tx_mq_pool[2048]; //rfid发送_消息队列控制块_内存池,如果TCP_MQ_SIZE=512Byte,可以容纳最多4封邮件 struct tcptx_msg /* TCP发送消息结构*/ { rt_uint8_t tx_buf[TCP_MQ_SIZE-4]; rt_size_t tx_buf_size; }; //**********************************TCP客户端创建和配置_被调用函数****************************************// tcp_client_socket_config(char* url, int port) { int sock = -1; int optval = 1; struct hostent *host; struct sockaddr_in s_addr; socklen_t flag; if ((NULL == url) || (port < 1000)) { rt_kprintf("TCP_ERROR: url_or_port is error! "); return -1; } host = gethostbyname(url); // 通过函数入口参数url获得host地址(如果是域名,会做域名解析 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { rt_kprintf("TCP_ERROR: socket create error! "); return -1; } // /* Disable the Nagle (TCP No Delay) algorithm */ // flag = 1; // setsockopt ( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) ); lwip_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); //开启tcp连接保活功能,时间见宏定义 /* 初始化预连接的服务端地址 */ s_addr.sin_family = AF_INET; s_addr.sin_port = htons(port); s_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(s_addr.sin_zero), 0, sizeof(s_addr.sin_zero)); /* 连接到服务端 */ if (lwip_connect(sock, (struct sockaddr *)&s_addr, sizeof(struct sockaddr)) < 0) { rt_kprintf("TCP_ERROR: lwip_connect()->connect to tcp_server error! "); /* close socket */ lwip_close(sock); return -2; } else { alive_flag = 1; rt_hw_led_off(1); //关闭报警灯 rt_hw_led_on(2); //开启在线灯 } return sock; } //**********************************TCP客户端非阻塞式接收_被调用函数****************************************// int lwip_recv_blocking(int s, void *mem, size_t len, int timeout) { int readlen; fd_set fds; int ret; struct timeval time_out; time_out.tv_sec = timeout/1000; time_out.tv_usec = (timeout%1000)*1000; while (1) { FD_ZERO(&fds); FD_SET(s, &fds); ret = lwip_select(s + 1, &fds, 0, 0, &time_out); if ( ret == 0 ) { // rt_kprintf("TCP_ERROR: lwip_recv_blocking()->lwip_select()->ret==0(nothing!) "); //表示没有描述符准备好 break; } else if (ret < 0) { rt_kprintf("TCP_ERROR: lwip_recv_blocking()->lwip_select()->ret < 0(tcp_error) "); //表示描述符出错了 return ret; } readlen = recv(s, ((char*)mem), len - 1, 0); if (readlen == 0) { rt_hw_led_off(2); //关闭在线灯 rt_kprintf("TCP_ERROR: lwip_recv_blocking()->recv()->readlen==0 "); //表示 return -1; } else if (readlen < 0) { rt_hw_led_off(2); //关闭在线灯 rt_kprintf("TCP_ERROR: lwip_recv_blocking()->recv()->readlen < 0(tcp_error) "); return readlen; } } return 0; } //**********************************TCP客户端发送管理线程_入口函数****************************************// static rt_uint8_t tcp_tx_stack[ 2048 ]; static struct rt_thread tcp_tx_thread; void tcp_tx_thread_entry(void*parameter) { struct tcptx_msg msg; //定义tcptx消息结构体 // int sock; // // tcp_client_sock = tcp_client_socket_config("192.168.3.100",8888); while(1) { if( rt_mq_recv(&tcp_tx_mq, &msg,sizeof(struct tcptx_msg),RT_WAITING_FOREVER) == RT_EOK ) //等待接受stp_tx消息(向TCP服务端发送数据) { send(tcp_client_sock, msg.tx_buf, msg.tx_buf_size, 0); ///* 发送数据到sock连接 */ } } } //**********************************TCP客户端接收管理线程_入口函数****************************************// static rt_uint8_t tcp_rx_stack[ 2048 ]; static struct rt_thread tcp_rx_thread; void tcp_rx_thread_entry(void*parameter) { int sock, recvlen=0; // sock = tcp_client_socket_config("192.168.3.100",8888); while(1) { if(tcp_client_sock == 0) { recvlen = lwip_recv_blocking(tcp_client_sock, tcp_recv_buf, MAX_TCP_RBUF-1, RECV_TIMEOUT); if (recvlen < 0) //recvlen 标志-1 说明网线断开 0 未接收到数据 >0 接收的数据长度 { rt_kprintf("TCP_ERROR: tcp_rx_thread_entry()-> recvlen<0 "); rt_hw_led_on(1); //打开报警灯 lwip_close(tcp_client_sock); tcp_client_sock = -1; alive_flag = 0; rt_kprintf("TCP_ERROR: tcp_rx_thread_entry()-> lwip_close(tcp_client_sock)... "); // break; //不能要 } if (recvlen == 0) { // rt_kprintf("TCP_ERROR: if (recvlen == 0) "); continue; } } else { rt_kprintf("TCP_info: tcp_rx_thread_entry()-> %dth try to connect to the tcp_server... ",try_to_count++); tcp_client_sock = tcp_client_socket_config("192.168.3.100",8888); if(tcp_client_sock == 0) { rt_kprintf("TCP_info: success connect to tcp_server! "); } } } } ```
查看更多
6
个回答
默认排序
按发布时间排序
andywyt
2013-11-16
这家伙很懒,什么也没写!
加入插拔网线检测中断,已经搞定!
jsszdfdn
2014-10-06
这家伙很懒,什么也没写!
能说明一下怎么改么?
枫魔龙少
2014-10-21
这家伙很懒,什么也没写!
>能说明一下怎么改么? --- MAC 或者PHY提供 插拔网线中断的
tazy
2014-10-23
这家伙很懒,什么也没写!
能说明一下怎么改么?
syc776
2016-12-09
这家伙很懒,什么也没写!
我用了这个例程 但是select一直返回 0 确认网络连接
撰写答案
登录
注册新账号
关注者
0
被浏览
7.6k
关于作者
andywyt
这家伙很懒,什么也没写!
提问
4
回答
39
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
RTduino物联网应用零基础入门
2
TinyUSB Demo运行教程
3
RT-Thread学习大礼包一键带走!
4
freemodbus从机调试说明
5
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
at_device
本月问答贡献
张世争
7
个答案
2
次被采纳
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部