由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 用ASIO写TCP/IP,同步还是异步 ?
相关主题
ASIO异步一问两个线程异步通信是不是用信号最好?
akka能和C++程序通信吗?关于clojure
服务器端纯的asio的异步怎么写?请教一个Node.js的疑惑
C++ ASIO异步一问express.js的作者弃node转投go
ASIO TCP传送JSON如何知道包结束?node.js不可放弃
JSONCPP和ASIO能否联合使用(C++11)?vertx里面同一个module多个verticle的疑问
boost vs C++11好了,现在可以发布我的发明之一了,物联网App Engine
来看一个实际问题吧ASIO发送返回消息时需要timeout吗?
相关话题的讨论汇总
话题: asio话题: json话题: tcp话题: 线程话题: ip
进入Programming版参与讨论
1 (共1页)
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的地方。

1 (共1页)
进入Programming版参与讨论
相关主题
ASIO发送返回消息时需要timeout吗?ASIO TCP传送JSON如何知道包结束?
coroutine comes to Java - Project LoomJSONCPP和ASIO能否联合使用(C++11)?
An interview project: asynchronous socket programmingboost vs C++11
求建议:C++的TCP/IP编程库来看一个实际问题吧
ASIO异步一问两个线程异步通信是不是用信号最好?
akka能和C++程序通信吗?关于clojure
服务器端纯的asio的异步怎么写?请教一个Node.js的疑惑
C++ ASIO异步一问express.js的作者弃node转投go
相关话题的讨论汇总
话题: asio话题: json话题: tcp话题: 线程话题: ip