作者:jll 日期:2006-04-30
出处:http://jll.cnblogs.com
一、前言
2005年7月下旬至8月中旬,我做了一个实现联通sgip1.2二级网关的项目,由于种种原因这个项目只完成了核心模块的2/5左右。此系统的源码几番周折,从硬盘转到邮箱,又从邮箱转到QQ网络硬盘。我想,应该赶在它“发霉”之前共享出来,一则可以让需要有的朋友作为参考; 二则或许可以得到相关朋友的指正,以此提高自已的水平。
二、为什么要选择.net 2.0作为开发平台
开始这个项目的时候,我有几个会用的平台或工具作为选择:
(1) Delphi 这东东就不用说了,组件多,开发资料也丰富,Indy 开发网络程序就足够强大
(2) C++ Builder 跟Delphi差不多,但是调用Socket API方便些
(3) .net 在多线程编程方面相对简单,同时对Socket也提供了很好地封装
之所以选择.net, 一方面是看中它强大的多线程库的支持,另一方面则是为了体验一下.net的威力[当时(当然也包括现在)对.net不是很熟悉]。考虑到这个项目是应用在服务器端且服务器性能较好,而用户也不会反感装一个20多兆的Framework,所以俺选择了它。
三、.net下socket编程的一些注意事项
(1) 如何将一个结构体转换为byte[],或者如何将byte[]转换为相应的结构体
有3种方式可以作为选择:
a) 一是采用序列化的方式,在发送前将对象序列化成byte[], 通过socket转发之后再将byte[]还原
b)用BitConvert类来处理
c)使用Unsafe方式
三种方式的详细实现请参见我的这篇blog: http://jll.cnblogs.com/archive/2005/07/23/198851.aspx
(2) 网络字节顺序与主机字节顺的转换
在写socket程序时要注意,如果要发送整型(short, int, long等)类型的数据,需要将这些值转换成网络字节顺序后才后再发送,同时接收方也要将网络字节顺序的值转为主机字节顺序的。System.Net.IPAddress类提供了HostToNetworkOrder 、HostToNetworkOrder 来完成相应的功能。
(3) 如何判断socket已经断开了
tcp的实现机制决定了这个处理这个问题的复杂性。 已连接的socket, 如果网络突然断开了或者是对方突然死机,tcp的默认实现机制是不能检测到这种情况的。然而,在.net下的Socket,即使你按照正常的程序来关闭Socket,它也不会有相应的事件或属性来告知您。
我的这篇blog: http://jll.cnblogs.com/archive/2005/07/29/203090.html 较详细地叙述了这个问题。
四、联通的sgip 1.2协议
网上资料很多,请自行google或baidu,^_^
五、程序源码及开发文档
这篇blog的核心就在于这里(https://files.cnblogs.com/JLL/sgipSMG.rar)了, 包括整个源代码和开发文档。请阅读里面的 "开发文档.doc" 文件; 用vs 2005打开sgipSMG.sln后,在“解决方案资源管理器”下会看到4个项目,其中 "sgipSMG 项目" 为核心代码所在。
需要的朋友请下载之。
good luck and have a good day!