请教lwip问题,tcp

请教lwip问题,tcp,第1张

你的问题不是很详细

如果是不知道位置:在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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12311482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存