如果是不知道位置:在LWIP的tcp_active_pcbs==tcp_active_pcbs->next
如果是非阻塞的方式运行:
现在的用法,还是用sys_thread_new创建物贺渣的,在tcpclient中这样处理的,但连接如果是server主动拍裂断掉可以检测到,但如果是其他原因,如网络错误之类的就检测不到了。
int fd
FD_ZERO(&fdR)
FD_SET(sock, &fdR)
switch (select(sock + 1, &fdR, NULL,NULL, &timeout))
{
case -1:
{
lwip_close(sock)
rt_free(recv_data)
recv_data = RT_NULL
GPIOB->罩悄BSRR = GPIO_Pin_5//灭灯
return 0
}
case 0:
break
default:
{
if(FD_ISSET(fd,&fdR))
{
int nread
ioctlsocket(fd,FIONREAD,&nread)
if(nread == 0)
{
//close
lwip_close(sock)
rt_free(recv_data)
recv_data = RT_NULL
GPIOB->BSRR = GPIO_Pin_5//灭灯
return 0
}
else
{
bytes_received = recv(sock, recv_data, 1024, 0)
if(bytes_received == 0)
{
//close
lwip_close(sock)
rt_free(recv_data)
recv_data = RT_NULL
GPIOB->BSRR = GPIO_Pin_5//灭灯
return 0
}
else
{
recv_data[bytes_received] = '\0'
//*****数据解析*******
if(Check_frame(recv_data) == 1)
{
link((u8_t *)recv_data,sock)
}
}
}
}
break
}
}
原始版本的lwip忘光了,提供我修改的,希望有帮助/*线程空间池*/
typedef struct tagNETTHREAD
{
BOOL state//状态
int prio//任务prio
OS_STKthreadStk[NET_THREAD_STK_LEN]//堆栈空间
}NETTHREAD, *PNETTHREAD
/*初始化线程空间*/
static BOOL ThreadSpaceInit(void)
{
int i
if ((NET_THREAD_MAX_NUM + 8 + 1) >OS_MAX_TASKS){ //线程任务最大数目超过OS_MAX_TASKS
return FALSE
}
for (i = 0i <NET_THREAD_MAX_NUMi ++){
NetThreads.state = THREAD_SPACE_STATE_FREE//状态为free
NetThreads.prio = NET_RECV_TASK_PRIO - 1 - i//任务prio分配为tcp主循环任务的上NET_THREAD_MAX_NUM个
}
return TRUE
}
/*每accept一个socket分配一个线程*/
int NetThreadCreate(void * s)
{
int i
for (i = 0i <NET_THREAD_MAX_NUMi ++){ //搜索线程池,首先释放已经销猛瞎闭毁的线程资源
if (NetThreads.state == THREAD_SPACE_STATE_DELING)//线程状态是否为del
if (OSTaskDel(NetThreads.prio) == OS_TASK_DEL_ERR){//若是,判断任务是否已经删除
NetThreads.state = THREAD_SPACE_STATE_FREE//若任务已经删除,则释放线程资源
}
}
for (i = 0i <NET_THREAD_MAX_NUMi ++){//搜索线程池,看是否有可用的线程资源
OS_ENTER_CRITICAL()
if (NetThreads.state == THREAD_SPACE_STATE_FREE){
NetThreads.state = THREAD_SPACE_STATE_USED
OS_EXIT_CRITICAL()
/*创建线程任务,server是scoket里面的任务服务函数,所以首先需要添加socket里面的域,并在建立服务期线程
connect成功的时候给你赋值*/
if (OSTaskCreate(((PSOCKET)s)->server, s, &NetThreads.threadStk[NET_THREAD_STK_LEN - 1],
NetThreads.prio)){
return (int)&NetThreads//返回线程id,必须在socket里面在添加神核一个域用来保存
}
NetThreads.state = THREAD_SPACE_STATE_FREE
}else{
OS_EXIT_CRITICAL()
}
}
return ERROR
}
/*销毁一个线程*/
void NetThreadDel(void * s)
{
PNETTHREAD pt//根据socket得到线程id(pt),
//线程空间的state要设枝裂置为del
pt->state = THREAD_SPACE_STATE_DELING
//在根据次id得到线程任务prio,删除任务
OSTaskDel(pt->prio)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)