b***i 发帖数: 3043 | 1 要求:服务器端(嵌入式)有三个网卡,同时监听,功能类似。如果有connect就发回
一个JSON,然后客户端发来一个JSON。之后,每次客户端都发一个JSON,我发回JSON。
如果某一次,发来的JSON是{exit},那么这个程序将退出,就是要结束所有三个网卡
的监听。
一般来说,只有最多两个客户端同时接入 。如果每个网卡设置接入上限则接受新的关
掉旧的。比如可以每个网卡规定最多只能三个连接。
==============
我用了asio,不想用boost。看到异步需要boost.bind。那么我是不是只能用同步?同步
如何退出线程?是不是可以设置每个操作的时限?
有人说线程增加1M内存,我用Linux,共有1G内存,应该不是问题。因为我最多9个线程
在监听。
另有人说,最好的退出block线程的方式是自己生成客户端来连接到监听的端口从而使
block的线程进行下去然后发现共有变量设为退出了,就退出。
关于异步我还有些问题,但是如果推荐同步我就不问这些问题了。 |
w***g 发帖数: 5958 | 2 最元始的退出同步监听的办法:收到exit消息后,先设置全局标记,然后用
kill传入pid=0,给本进程下所有线程发信号。像select/accept/read/write
这类操作在阻塞过程中如果收到信号就会返回,错误码为EINTR。
这样你就有机会干净退出了。
【在 b***i 的大作中提到】 : 要求:服务器端(嵌入式)有三个网卡,同时监听,功能类似。如果有connect就发回 : 一个JSON,然后客户端发来一个JSON。之后,每次客户端都发一个JSON,我发回JSON。 : 如果某一次,发来的JSON是{exit},那么这个程序将退出,就是要结束所有三个网卡 : 的监听。 : 一般来说,只有最多两个客户端同时接入 。如果每个网卡设置接入上限则接受新的关 : 掉旧的。比如可以每个网卡规定最多只能三个连接。 : ============== : 我用了asio,不想用boost。看到异步需要boost.bind。那么我是不是只能用同步?同步 : 如何退出线程?是不是可以设置每个操作的时限? : 有人说线程增加1M内存,我用Linux,共有1G内存,应该不是问题。因为我最多9个线程
|
T********i 发帖数: 2416 | 3 你这种应用,属于大马拉小车。
我给你出个主意好了。你就单线程。设置每个socket成non blocking。
每个循环读写完毕后等1ms。
【在 b***i 的大作中提到】 : 要求:服务器端(嵌入式)有三个网卡,同时监听,功能类似。如果有connect就发回 : 一个JSON,然后客户端发来一个JSON。之后,每次客户端都发一个JSON,我发回JSON。 : 如果某一次,发来的JSON是{exit},那么这个程序将退出,就是要结束所有三个网卡 : 的监听。 : 一般来说,只有最多两个客户端同时接入 。如果每个网卡设置接入上限则接受新的关 : 掉旧的。比如可以每个网卡规定最多只能三个连接。 : ============== : 我用了asio,不想用boost。看到异步需要boost.bind。那么我是不是只能用同步?同步 : 如何退出线程?是不是可以设置每个操作的时限? : 有人说线程增加1M内存,我用Linux,共有1G内存,应该不是问题。因为我最多9个线程
|
b***i 发帖数: 3043 | 4 我倾向与线程blocking,你倾向于单线程non blocking,那就不用异步了?
看起来,这个和我对待串口一样,用查询方案?具体咋写?我还是要用asio的,不想用
裸的C,asio不是跨平台嘛
【在 T********i 的大作中提到】 : 你这种应用,属于大马拉小车。 : 我给你出个主意好了。你就单线程。设置每个socket成non blocking。 : 每个循环读写完毕后等1ms。
|
T********i 发帖数: 2416 | 5 线程blocking唯一的问题就是linux下,如果一个thread在读socket。另外一个thread
close socket。那个读的thread会一直block。
windows下那个读的thread会立刻返回一个错误。
这个世界就是不完美,大家都suck。而且各自有各自suck的地方。
【在 b***i 的大作中提到】 : 我倾向与线程blocking,你倾向于单线程non blocking,那就不用异步了? : 看起来,这个和我对待串口一样,用查询方案?具体咋写?我还是要用asio的,不想用 : 裸的C,asio不是跨平台嘛
|
w***g 发帖数: 5958 | 6 如果只是读出来写磁盘这么做最好,但如果要解析读进来的消息,
有可能消息读了一半read就返回EAGAIN了,得自己维护buffer。这样反而就麻烦了。
【在 T********i 的大作中提到】 : 你这种应用,属于大马拉小车。 : 我给你出个主意好了。你就单线程。设置每个socket成non blocking。 : 每个循环读写完毕后等1ms。
|
T********i 发帖数: 2416 | 7 buffer就是一个concat算法。属于最简单的算法了吧?
其实他说到json。他还要计数左括号和右括号数量才行呢。
这属于最简单的状态自动机了。我对他有信心。
【在 w***g 的大作中提到】 : 如果只是读出来写磁盘这么做最好,但如果要解析读进来的消息, : 有可能消息读了一半read就返回EAGAIN了,得自己维护buffer。这样反而就麻烦了。
|
d****i 发帖数: 4809 | 8 他的应用场合不应该用JSON, 应该直接用raw bytes做解析,JSON的overhead太大了。
【在 T********i 的大作中提到】 : buffer就是一个concat算法。属于最简单的算法了吧? : 其实他说到json。他还要计数左括号和右括号数量才行呢。 : 这属于最简单的状态自动机了。我对他有信心。
|
T********i 发帖数: 2416 | 9 他那一个通道才几K波特率?刚才我是笔误。应该是大马拉小车。
比他那个CPU性能低100倍的系统都游刃有余。
现在他的任务是找到最stupid的办法。只要稳定就行。
【在 d****i 的大作中提到】 : 他的应用场合不应该用JSON, 应该直接用raw bytes做解析,JSON的overhead太大了。
|
b***i 发帖数: 3043 | 10 应该是找到开发迅速,结果稳定的办法,不一定stupid啊。
【在 T********i 的大作中提到】 : 他那一个通道才几K波特率?刚才我是笔误。应该是大马拉小车。 : 比他那个CPU性能低100倍的系统都游刃有余。 : 现在他的任务是找到最stupid的办法。只要稳定就行。
|
b***i 发帖数: 3043 | 11 看你比较多的看法,给你个整体概念:
原来系统16MHz,16M内存能够对付,要求10M以太网,FAT16。现在新的系统为什么要改这
么多呢?一个是需求改成Gigabit Ethernet,无线,一个是要对未来的设备能够容易增
加功能,还要面向未来。
原来的系统用C,自己写没有OS的TCP/IP(库是买的),自己发明二进制的协议,和PC
控制软件(MFC)一起使用。PC上直接改变嵌入式的所有变量。就是一个struct,里面内
容全部被这个二进制协议改变。这样要写一个协议调试软件,解释这个二进制到底什么
意思,在开发阶段帮助解决bug。电路方面自己画包括RAM,Flash, Ethernet Phy在内的
所有电路。应该说,这个设备用了10年才完善起来。
现在的要求是1年内完成从电路到软件的要求。所以稳定,快速开发才是最重要的。所
以,我直接买板子,上面有了千兆以太网,有了SDIO接口(64G都可以用,属于SDXC),
内存1G。为什么1G呢? 因为1G DDR3内存比512M便宜,而Xilinx最多只能用1G。然后使
用Linux把TCP/IP, USB,Wi-Fi全都搞定。但是还剩下显示,和10个通道的串口需要自
己搞一下。别人要我用uCOS。问题是uCOS并不包括其他的库,还要自己买,还不一定比
Linux好呢。
由于有了Linux,嵌入式已经完全变成了软件,基本不考虑嵌入式的问题。就这样还只
有6个月来搞Linux软件和PC的软件。我10个通道1200-3600波特率,每个通道需要每秒
大约做多6次来回。而TCP/IP用Json的通讯一年不用100次,其实就是配置的时候用一次
。所以用JSON可以避免开发协议解释软件,因为人可以看懂文本文件。另外的实时需求
的是Modbus TCP。这个是大约1秒一次或者几次的压力。
关于面向未来,原来设计系统的退休的创业者说,他95年创业的时候,用了当时顶级的
32位CPU, 后来加了FAT16进行CF操作,心想怎么都够了吧,能到2GB呢。结果现在成了
瓶颈,而这个CPU从来没有升级过。所以,现在的项目要用目前顶级的设备,保证未来
10年能够不至于太快过时。
【在 d****i 的大作中提到】 : 他的应用场合不应该用JSON, 应该直接用raw bytes做解析,JSON的overhead太大了。
|
b***i 发帖数: 3043 | 12 我为什么想用Java呢?就是不想自己解释JSON,我要找别人的库来解释。如果左右括号
不对直接返回错误就完了。另外,我可能使用递归来解释,也不用状态机了。
【在 T********i 的大作中提到】 : buffer就是一个concat算法。属于最简单的算法了吧? : 其实他说到json。他还要计数左括号和右括号数量才行呢。 : 这属于最简单的状态自动机了。我对他有信心。
|
b***i 发帖数: 3043 | 13 http://stackoverflow.com/questions/2486335/wake-up-thread-block
有shutdown,有pipe的方案,虽然不是很懂,但是很诱人。
thread
【在 T********i 的大作中提到】 : 线程blocking唯一的问题就是linux下,如果一个thread在读socket。另外一个thread : close socket。那个读的thread会一直block。 : windows下那个读的thread会立刻返回一个错误。 : 这个世界就是不完美,大家都suck。而且各自有各自suck的地方。
|
b***i 发帖数: 3043 | 14 这个在asio下难道不是eof?
asio的例子写的
size_t len = socket.read_some(asio::buffer(buf), error);
if (error == asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw asio::system_error(error); // Some other error.
thread
【在 T********i 的大作中提到】 : 线程blocking唯一的问题就是linux下,如果一个thread在读socket。另外一个thread : close socket。那个读的thread会一直block。 : windows下那个读的thread会立刻返回一个错误。 : 这个世界就是不完美,大家都suck。而且各自有各自suck的地方。
|