文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发C/C++使用C#查询路由接口,同时小议一些.net 2.0的诡异API
精品推荐
特别推荐
·C语言编程易犯毛病集合
·C语言编程常见问题解答(目录)
·C#程序开发中的常用函数汇总
·C/C++笔试、面试题目大汇总
·Beej的网络socket编程指南
·socket编程原理
·C语言的常用库函数使用方法分析及用途
·在C语言中如何处理时间和日期
·C++设计模式之Singleton
·VC++动态链接库编程之MFC扩展 DLL
·TCP/IP网络重复型服务器通信软件的设计
·DirectX游戏开发入门
·经典与现代的结合:在MFC中集成RAD .NET框架
·Windows API-GDI入门基础知识详解(2)
·Visual C++ 入门精解
·C#基础概念二十五问
·用C#实现pdf文件的完整性验证
·成为嵌入式程序员应知道的0x10个问题
·TCP/IP编程实现远程文件传输
·几个C#编程的小技巧
热点TOP10
·socket编程原理
·C#程序开发中的常用函数汇总
·C#基础概念二十五问
·Visual C++ 入门精解
·asp.net中调用javascript函数实现多功能日期控件示例
·《C语言程序设计》教学的几点体会
·简易的四则运算
·学生成绩管理系统实习
·C# GridView 排序及分页
·C#中ArrayList.CopyTo()运行错误的解决方法
·C++ builder 的文件读写操作总结
·C#源码读取excel数据到程序中-SQL SERVER-到dataset中
·TCP/IP编程实现远程文件传输
·C++设计模式之Singleton
·C宏--智者的利刃,愚者的恶梦
·实现真正意义上的二维动态数组模板
·Delphi中用FastReport制作报表
·VC++下用MSComm控件实现串口通讯
·Beej的网络socket编程指南
·C宏——智者的利刃,愚者的恶梦!

使用C#查询路由接口,同时小议一些.net 2.0的诡异API

日期:2007年1月8日 作者: 查看:[大字体 中字体 小字体]


有时候我们希望知道程序正在使用那个IP地址连接到远程的服务器(类似pathping命令返回的第一个结果,P2P应用中尤其多见),文末的代码可以完成这个任务

写完这段代码之后,我对.net API的设计有些不满了。

首先就是Socket类的IOControl方法,该方法脱胎于Winsock2 API的WSAIoctl函数。对于基于C语言的Winsock2 API,设计出WSAIoctl显得还合情合理,虽然冗长的参数列表很是吓人,但是对于面向对象的C#,居然还需要使用byte[]这些弱类型的数据结构来做参数,实在是有些匪夷所思了,我觉得Socket类应该对IOControl进行充分的包装,以便没有Win32 API经验的用户更好的使用。


接着是IPEndPoint的序列化形式SocketAddress类,这个类明显的与sockaddr structure一样,不同的是,它比sockaddr structure更加难以使用。它提供了一个象数组一样的索引器,允许用户以[]运算符获取其中的byte元素,但是却不提供方法简便的将其中的内容复制到一个byte[]中供Socket.IOControl调用,竟然需要客户自己使用循环来调用,实在傻的可以。


最后是IPEndPoint,它居然需要实例化之后才能调用Create成员函数把一个SocketAddress实例反序列化成一个IPEndPoint对象,我晕,为啥不是静态的呢?看了这个Create方法的代码之后,我发现完全没有必要将其做成成员函数(为了证明静态方法的可行,我在文中创建了一个CreateIPEndPoint静态方法,并用它替换了IPEndPoint.Create成员方法),不知道为了使这个方法看起来更像是成员方法还是其他什么原因,SocketAddress的AddressFamily居然必须和IPEndPoint实例的AddressFamily一致,否则就抛出异常,狂晕,人家反序列化还得看你一个不知所谓的对象的脸色,真是惨。

以上是我的观点,欢迎大家一起议议。

using System;
using System.Net.Sockets;

using System.Net;

 

 

class Program

{

    static IPEndPoint QueryRoutingInterface(Socket sock,

                                            IPEndPoint remoteEP)

    {

        SocketAddress sa = remoteEP.Serialize();

 

        byte[] addrBytes = new byte[sa.Size];

 

        for (int i = 0; i < sa.Size; i++)

        {

            addrBytes[i] = sa[i];

        }

 

        byte[] outBytes = new byte[addrBytes.Length];

 

        sock.IOControl(IOControlCode.RoutingInterfaceQuery,

                                   addrBytes,

                                   outBytes);

 

        for (int i = 0; i < sa.Size; i++)

        {

            sa[i] = outBytes[i];

        }

 

 

        EndPoint ep = CreateIPEndPoint(sa);//remoteEP.Create(sa);

 

        return (IPEndPoint)ep;

    }

 

    /// <summary>

    /// 根据SocketAddress创建IPEndPoint

    /// </summary>

    /// <remarks>该函数从IPEndPoint的Create方法反编译出来</remarks>

    /// <param name="socketAddress"></param>

    /// <returns></returns>

    public static IPEndPoint CreateIPEndPoint(SocketAddress socketAddress)

    {

        //if (socketAddress.Family != this.AddressFamily)

        //{

        //    throw new ArgumentException(SR.GetString("net_InvalidAddressFamily",

        //        new object[] { socketAddress.Family.ToString(),

        //            base.GetType().FullName, this.AddressFamily.ToString() }),

        //            "socketAddress");

        //}

 

        if (socketAddress.Size < 8)

        {

            //throw new ArgumentException(SR.GetString("net_InvalidSocketAddressSize",

            //    new object[] { socketAddress.GetType().FullName,

            //        base.GetType().FullName }),

            //        "socketAddress");

 

            throw new ArgumentException();

        }

 

//if (this.AddressFamily == AddressFamily.InterNetworkV6)

        if (socketAddress.Family == AddressFamily.InterNetworkV6)

        {

            byte[] buffer1 = new byte[0x10];

            for (int num1 = 0; num1 < buffer1.Length; num1++)

            {

                buffer1[num1] = socketAddress[num1 + 8];

            }

            int num2 = ((socketAddress[2] << 8) & 0xff00) socketAddress[3];

            long num3 = (((socketAddress[0x1b] << 0x18)

                + (socketAddress[0x1a] << 0x10))

                + (socketAddress[0x19] << 8)) +

                        socketAddress[0x18];

            return new IPEndPoint(new IPAddress(buffer1, num3), num2);

        }

 

        int num4 = ((socketAddress[2] << 8) & 0xff00) socketAddress[3];

 

        long num5 = ((((socketAddress[4] & 0xff)

            ((socketAddress[5] << 8) & 0xff00))

            ((socketAddress[6] << 0x10) & 0xff0000))

            (socketAddress[7] << 0x18)) & ((long)0xffffffff);

 

        return new IPEndPoint(num5, num4);

    }

 

 

    static void Main(string[] args)

    {

        try

        {

            Socket s = new Socket(AddressFamily.InterNetwork,

                                  SocketType.Dgram,

                                  ProtocolType.Udp);

 

            s.Bind(new IPEndPoint(IPAddress.Any, 10001));

 

            IPEndPoint remoteEP = new IPEndPoint(

                Dns.GetHostAddresses("www.google.com")[0],

                1000);

 

            IPEndPoint ep = QueryRoutingInterface(s, remoteEP);

            Console.WriteLine(remoteEP);

            Console.WriteLine(ep);

        }

        catch (SocketException e)

        {

            Console.WriteLine(e);

            Console.WriteLine(e.ErrorCode);

        }

    }

}



[1] [2] 下一页 




上一篇:C#中常用到的JS

下一篇:C#连接mysql

使用C#查询路由接口,同时小议一些.net 2.0的诡异API 相关文章:
·IE7.0浏览器有用的9个使用技巧
·GHOST使用方法(图解)
·在PB中如何实现数据模糊查询
·Vista系统使用技巧总结
·电脑使用一段时间后会变慢原因解析
·不可以不看的一些网站
·QQ空间导航代码最新版使用方法
·Ajax实现分页查询
·LCD显示器系列知识:什么是HDMI接口?
·Windows错误代码大全集合查询
使用C#查询路由接口,同时小议一些.net 2.0的诡异API 相关软件:
·有关毛泽东的一些问题解答(不完整版)
·黑客视频教程 VMware虚拟机的安装和使用
·使用GPMC随心所欲管理组策略
·黑客视频教程-灰鸽子远控使用教程
·Adobe Photoshop CS 2 简体中文使用指南
·FLASH 8中文使用手册
·IIS4使用手册
·使用JSP建设动态网站教程
·CASP.NET以及数据库的一些电子书,初次做种
·黑客视频教程-网吧代理服务器使用灰鸽子端口映射方法

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot