基于dotnet2.0的联通sgip1.2协议二级网关源码


作者: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类提供了HostToNetworkOrderHostToNetworkOrder 来完成相应的功能。

       (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!
     

posted on 2006-04-28 11:25  楚潇  阅读(3548)  评论(14编辑  收藏  举报