poco 网络编程
因为之前被坑的比较惨,所以明白一个好的网络库对项目稳定性有多大的帮助。
讲一下,网络IO模型有哪几个种类,
阻塞:
1.一问一答(send()一个,recv() 一个)
2.一问多答(send()一个,recv() 多个)
非阻塞:
1.一个线程一直recv(), send() 按需发送
2.一个线程send(),一个线程recv()
所有的网络IO模型 ,建议参考 陈硕 <linux网络编程>
参考
【翻译】两种高性能I/O设计模式(Reactor/Proactor)的比较
还需要根据自己的业务 确认使用长连接,短连接(有状态,无状态), TCP还是UDP, 服务端超时T线, 黑名单, !
如何使用POCO 最好还是应该从代码实现来看,确认各个类的继承关系,全部看完基本就知道,自己要用什么了。(使用参考TestSuit,Sample)
看需求,确认用哪个类,
- 如果你用http进行POST GET REQUEST处理,那么 *HTTP、HTTPClient、 HTTPServer*应该是你的选择,
- 如果你要用ping命令探查一些主机是否在线,那么就用*ICMP* 。
- 如果要用socket进行收发数据,
先确认 是写client端还是Server端, 使用TCP还是UDP,是阻塞还是非阻塞,是否有发广播等等...
client可以用:【Socket】中的Socket,StreamSocket, RawSocket,DatagramSocket...
Server可以用:【Socket】中的Socket,StreamSocket, RawSocket,DatagramSocket...
【Reactor】中的ParallelSocketAcceptor,ParallelSocketReactor,SocketAcceptor,SocketConnector,SocketNotification,SocketNotifier,SocketReactor
【TCPServer】中的TCPServer,TCPServerConnection,TCPServerConnectionFactory,TCPServerDispatcher,TCPServerParams
当然这只是其中的很小一部分。
无状态,sendBytes(),recvBytes()都是不确定的
首先sendBytes()有事件就发送,很简单没问题。
那recvBytes()呢?如何一直接收数据?
这又回到更原始的问题,网络模型 select,poll,epoll,是什么,用什么实现的。
我们知道,select,poll都是先把fd加入set中, 然后对set中所有fd进行轮训,确认是否可以read,write,或者exception.
首先系统函数select中只是对set中所有的fd进行轮训一次。
那么select(),poll(),只是查询一次, 如果下次又来了数据怎么办?
=>只能用while()不管去轮训状态了,
所以不断接收数据的模型是这样的
windows select参考
https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx
unix-like 参考
http://www.tenouk.com/Module41.html