1.概述
GNet是基于GLib的一套网络开发包,软件包的名称是:libgnet2.0-0和libgnet2.0-dev。基于GNet开发的软件不多,不过这不能说明什么问题。
2.特性介绍
不知从哪里看到过一句话,GNet就像是Java的NIO。无论怎么样,还是先简单介绍下它吧:
GNet是一个网络库,是用C写的面向对象的(跟GTK一样),并且基于GLib。它旨在简易使用和可移植。
特性:
•TCP "client" and "server" sockets
•UDP and IP Multicast sockets
•High-level TCP connection and server objects
•Asynchronous socket IO
•HTTP client object
•Internet address abstraction
•Asynchronous DNS lookup
•IPv4 and IPv6 support
•Byte packing and unpacking
•URI parsing
•SHA and MD5 hashes
•Base64 encoding and decoding
•SOCKS support
英文不翻译了,很简单易懂。重点拿几个说说。
首先是Asynchronous socket IO(异步Socket IO),看过Java的NIO,知道它是非阻塞的。
由于对Linux Socket了解不多,就不知道怎么使用异步IO。而GNet这套网络库,把Socket以面向对象的模式包装了一遍,并有非常方便可查的API:http://www.gnetlibrary.org/docs/index.html
在GNet库下,从一个InetAddr创建一个TCP连接,使用这个API:gnet_tcp_socket_new (),写过GTK就会对这个句式非常熟悉。这样就创建了一个TCP连接的实例。
如果要创建异步的TCP连接呢?使用gnet_tcp_socket_new_async ()就可以了,其中第二个参数是一个Callback,每当有连接时,就会触发,也就是异步了。跟GTK图形编程的信号/回调是一样的道理。
另外GLib中就有GIOChannel 这个东西,在GNet中也得到了扩展。GIOChannel就是一个IO通道,一般都与异步类一起使用。使用g_io_add_watch来监视一个IO 通道,当有IO事件发生时,就可以触发相关Callback。这样就可以不用一直While(True)来收发东西了。
还有一个重要的是:Byte packing and unpacking
用于包装数据至字节流中,功能跟Python中的struct一样。利用这个,就可以非常方便地写个跟Java的ByteBuffer一样的类了。
还有URI、MD5/SHA的Hash支持,IPv6支持,都证明了这个GNet库不仅方便,而且全面和强大。
通过GNet,编写网络应用程序就方便多了。