LWIP中非阻塞模式accept解决方案
来源:互联网 发布:cp linux 编辑:程序博客网 时间:2024/05/02 00:51
LWIP中socket是阻塞模式,如何在NIOS II中实现非阻塞模式的socket,通过fcntl等改变socket模式无法实现,可以采用多线程和定时器相结合的方式实现非阻塞模式的accept。
1)创建线程(任务),一个是主任务,另外一个是accept等待的任务(里面只有一个accept函数的循环运行)。
2)建立定时器中断,定时间隔自己选择,并编写中断服务程序。
3)accept函数返回的socket号以全局变量形式定义,方便两个任务间的通信连接。
4)运行时在需要等待连接处,开启定时器,并将主任务挂起,accept等待任务恢复,在定时时间内等待网络连接,定时时间到执行中断服务程序,挂起accept等待任务,恢复主任务,根据accept的返回值fd_visitor来判断是否有网络连接,如果fd_visitor值大于0,则说明有网络连接,建立网络连接,否则没有。
5)这样程序不会死在accept处,持续等待网络连接,而是等待一段时间后继续执行其他任务。
程序附录:
1)定时器中断服务程序:
void hand_timer1_interrupt()
{
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE,0);
if(timer_cnt0 < 5000) //5s执行一次查询
timer_cnt0++;
else
{
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE,10);//关闭定时器
timer_cnt0=0;
printf("timer over\n");
OSTaskSuspend(SD_PIRO);
OSTaskResume(INNET_PIRO);
}
}
2)主线程部分程序
fd_listen=socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(TCP_PORT);
addr.sin_addr.s_addr = inet_addr(ip); //设定系统的IP
bind(fd_listen,(struct sockaddr *)&addr,sizeof(addr));
listen(fd_listen,5);
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE,7);
OSTaskSuspend(INNET_PIRO);
OSTaskResume(SD_PIRO);
3)accept等待任务
void Task_wait()
{
while(1)
{
fd_visitor=accept(fd_listen,(structsockaddr*)&addr_rec,&sock_len);
}
}
- LWIP中非阻塞模式accept解决方案
- [LWIP学习]--accept函数分析
- 非阻塞模式for (;;)//hAcceptSock = accept(hSock
- 关于socket的Accept阻塞模式的退出方法分析
- 非阻塞accept
- accept阻塞挡不住
- accept非阻塞
- accept非阻塞方式
- 非阻塞accept recv
- accept的非阻塞
- 非阻塞accept
- 89-非阻塞 accept
- 关于accept非阻塞
- android中非阻塞socket通信
- android中非阻塞socket通信
- LWIP接收数据阻塞问题
- accept不阻塞的原因
- 非阻塞connect()和accept()
- grails 消息定义的参数含义!
- 绽放新娘的魅力
- synchronized与static synchronized 的区别
- 留着自己看
- android notification 简介
- LWIP中非阻塞模式accept解决方案
- 2.3软件工程下软件开发环境
- 常用查看Linux系统信息命令
- 如何使用NSValue 类型包含C结构体
- 设计模式——终结者模式(Mediator)
- src/number/ServiceImpl.java
- android 添加应用到android源码中
- 3软件构件与中间件
- net use错误原因解决