套接字(Sockets)是引用網絡連接的特殊的文件描述符,它由三個基本要素組成:網絡類型、數據傳輸類型、采用的網絡協議。System.Net.Sockets名稱空間包含了可以給低級Winsock API提供實際.Net接口類。套接字是網絡編程的核心。每種具體的網絡協議都有自己所定義的地址空間表式方法,但本質相同的。

      首先我們要了解一些基本IP地址和端口的知識。

      IP是Internet網絡設備之間傳輸數據的一種協議。IP地址主要有兩部分組成:一部分用於區分不同網絡,一部分用於區分網絡上不同的設備。

    網絡類的范圍划分如下:

    A類:0.X.X.X 至127.X.X.X

    B類:128.X.X.X至191.X.X.X

    C類:192.X.X.X至223.X.X.X

    D類:224.X.X.X至239.X.X.X

    E類:240.X.X.X至255.X.X.X

     每類網絡又可進一步分成不同的網絡,或者叫子網。每個子綱必須有個公共的網址把它與該類網絡中的基祂子網分開。為了識別IP地址的綱絡部分,又為特定的子網定義了子網掩碼。子網掩碼用於標識哪些位作為網絡地址部分,哪些作為主機地址。

     在System.Net命名空間中,有兩個專門用於處理各種類型IP地址信息的類:IPAddress類和IPEndPoint類。

     IPAddress類用天表示一個IP地址,一般使用Parse()方法創建IPAddress的實例:

     IPAddress ip=IPAddress.Parse("192.168.1.1");

     IPAddress類還提供了4個只讀字段,分別代表程序中使用的特殊IP地址:

     Any:代表本地系統可用的任何IP地址。

     Broadcast:代表本地網絡的IP廣播地址。

    LoopBack:代表系統的回送地址。

    None:代表系統上沒有網絡接口。

   在System.Net名稱空間下,包含有一個Dns類,可以利用該類的GetHostName方法以找到本地系統主機的名,然後再用GetHostByName找到主機的IP地址。例如:

   using System;

   using System.Net;

   class GetUserIP

     {

       public static void main()

     {

       //得到主機名

        string strComputerName=Dns.GetHostName();

        IPHostEntry IpMe=Dns.GetHostByName(name);

        foreach(IPAddress ip in IpMe.AddressList)

                {

                   Console.WriteLine("IP地址:"+ip.ToString());

                 }

                  IPAddress ip1=IPAddress.Parse("127.0.0.1");

                  IPAddress ip2=IPAddress.Loopback;//回送地址

                  IPAddress ip3=IPAddress.Broadcast;//IP广播地址

                  IPAddress ip4=IPAddress.Any;//本地系统可用的任何IP地址

                  IPAddress ip4=IPAddress.None; //系统上没有网络接口  

     }

     }   

Any返回0.0.0.0地址,當系統有多個網絡接口,而用戶不想把套接字綁定到任何特定接口 時,不可以使用這個地址。None Address指向255.255.255.255地址,一般用於當系統想創建一個偽套接字,而且不想它綁定任何接口時。

     真正相互完成通信功能的不是兩台計算機,而是兩台計算機上的進程。IP地址僅僅能夠具體標識到某臺主機,而不能標識計算機上的進程。如果要標識具體的進程,需要引入新的地址空間,那就是端口。定義端口是為了解決與多個應用程序同時進行通信的問題,它主要是擴充了IP地址的概念。端口號的范圍是0-65535

     IPEndPoint類位於System.Net名稱空間下,IPEndPoint對象用於表示指定的IP地址/端口的組合。其構造函數為:IPEndPoint(IPAddresss address,int port)

該類常用屬性:

Address:得到或者設置IP地址。

AddressFamily:得到IP地直系列。

Port:得到或設置TCP或UDP端口號。

            listBox1.Items.Clear();
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint IPPort = new IPEndPoint(ip, 8000);
            listBox1.Items.Add("主机IP和端口組合 " + IPPort.ToString ());
            listBox1.Items.Add("主機IP " + IPPort.Address);
            listBox1.Items.Add("IP地址系列  " + IPPort.AddressFamily);
            listBox1.Items.Add("最大端口 " + IPEndPoint.MaxPort );
            listBox1.Items.Add("最小端口" + IPEndPoint.MinPort);

套接字

     System.Net.Sockets名稱空間包含一個Socket類,該類提供了一個與低級Winsock API的接口。Socke類的構造函數為:

     Socket(AddressFamily af,SocketType st,ProtocolType pt)

      其中,AddressFamily為網絡類型,SocketType為數據類型,ProtocolType為使用網絡協議.

     Socket構造函數的3個參數中,對網絡上的IP通信來說,AddressFamily總是使用AddressFamily.InterNetwork枚舉值。

    SocketType參數則與ProtocolType參數配合使用,不允許其祂的匹配形式,也不允許混淆匹配。IP通信的組合如下:

 

IP套接字定義組合

      SocketType                 ProtocolType             說明

         Dgram                        Udp                  無連接通信

         Stream                        Tcp                  面向連接通信

          Raw                           Icmp                 Internet控制報文協議

          Raw                           Raw                  簡單IP包通信

知道了構造函數的參數含義,就可以創建套接字的實列了:

       Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)

可以利用Socket類提供一些屬性方便地設置或檢索信息

                           套接字常用屬性               

屬性                                  說明

           Avilable                            獲取准備讀取的數據量

           Blocking                    獲取或設置套接字是否處阻塞模式

           Connected                           獲取一個套接字連接

           LocalEndPoint                    獲取套接字本地EndPoint

           RemoteEndPoint                  獲取套接字遠程EndPoint

事例代碼:

        listBox1.Items.Clear();
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        IPEndPoint ipPort = new IPEndPoint(ip,8555);
        Socket socket = new Socket(AddressFamily.InterNetwork ,SocketType.Stream ,ProtocolType.Tcp);
        socket.Bind(ipPort);
        listBox1.Items.Add("Blocking值 " + socket.Blocking);//得到或設置套接字是否處於阻塞模式
        listBox1.Items.Add("Connected值 " + socket.Blocking);//得到或設置套接字是否與遠程設備連接
        listBox1.Items.Add("LocalEndPoint值 " + socket.LocalEndPoint );//得到或設置套接字本地EndPoint對象

       在實際應用中,可以通過調用Socket對象的SetSocketOption方法設置套接字的各種選項,它有3種重載形式:

       public void SetSocketOption(SocketOptionLevel sl,SocketOptionName sn,byte[] value)

       public void SetSocketOption(SocketOptionLevel sl,SocketOptionName sn,int value)

       public void SetSocketOption(SocketOptionLevel sl,SocketOptionName sn,object value)

 

                      常用選項值

SocketOptionLevel     SocketOptionName           說明

     IP               HeaderIncluded     指發送套接字的數據將包括IP

     IP               IPOptions          指定IP選項用於輸出包中

     IP               MulticastInterface    設置組播包使用的接口

     IP               MultiLoopBack      IP組播回送

     IP               PacketInformation    返回關于接收包的信息

     IP               UnBlockSource      設置套接字為無阻塞模式

   Socket            AccptConnection      如果為真,表明套接字正在偵聽

   Socket            Broadcast           如果為真,表只充許套接字發廣播

   Socket            MaxConnections     設置使用最大隊列長度

   Socket            ReceiveBuffer       接收套接字的緩存大小

   Socket            ReceiveTimeOut     接收套接字的超時時間

   Socket            SendBuffer          發送套接字的緩存大小

   Socket            SendTimeOut        發送套接字超時時間

   Socket            UseLookBack        使用回傳

   Tcp              NoDelay             為發送合並禁用Nagle算法

   Udp              ChecksumConverage   設置或獲取UDP校驗和覆蓋

   Udp             NoChecksum        設置校驗和設置為零的UDP數據報

posted on 2008-12-04 11:54  Blade  阅读(496)  评论(0编辑  收藏  举报