套接字(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數據報