IPAddress ip = IPAdress.Parse(“192.168.1.1”);
IPAddress类提供了7个只读字段,分别代表程序中使用的特殊的IP地址:
Any 表示本地系统可用的任何IPV4地址
Broadcast 表示本地IPV4网络广播地址
IPV6Any Socket.Bind方法用此字段指出本地系统可用的IPV6地址
IPV6Loopback 表示系统的IPV6回送地址
IPV6None 表示系统上没有可用的IPV6网络接口
Loopback 表示系统的IPV4回送地址
None 表示系统上没有可用的IPV4网络接口
GetHostAddresses方法
获取指定主机的IP地址,返回一个IPAddress类型的数组,函数原型为:Public static IPAddress[] GetHostAddresses(string hostNameOrAddress);
例如:
IPAddress[] ip = Dns.GetHostAddresses(“https://www.doczj.com/doc/206269147.html,”);
listBox1.Items.AddRange(ip);
GetHostName方法:
获取本机主机名。例如:
String hostname = Dns.GetHostName();
IPHostEntry类包含两个常用的属性:
1.AddressList属性的作用是获取或设置与主机相关联的IP地址列表,是一个
IPAddress类型的数组,包含了指定主机的所有IP地址。
2.HostName属性包含了服务器的主机名。
例子:
listBox1.Items.Add(“搜狐新闻所用的服务器IP地址有:”);
IPAddress[] ip = Dns.GetHostEntry(“https://www.doczj.com/doc/206269147.html,”).AddressList;
listBox1.Items.AddRange(ip);
listBox1.Items.Add(“本机IP地址为:”);
ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
listBox1.Items.AddRange(ip);
IpEndPoint类的构造函数:
Public IPEndPoint(IPAddress,int); IPAddress参数指定IP地址,,int指定相应的端口号。网络地址和服务端口的组合称为端点。在C#中使用IPEndPoint类表示这个端点,该类包含了应用程序连接到主机的服务所需的IP地址和端口信息。
结合IPAddress类、Dns类、IPHostEntry类和IPEndPoint类的使用方法运行下面的例子:Private void buttonLocal_Click(object sender , EventArgs e)
{
listBox1.Items.Clear();
string name = Dns.GetHostName();
listBox1.Items.Add(“本机主机名:” + name);
IPHostEntry me = Dns.GetHostEntry(name);
listBox1.Items.Add(“本机所有IP地址:”);
foreach(IPAddress ip in me.AddressList)
{
listBox1.Items.Add(ip);
}
IPAddress localip = IPAddress.Parse(“127.0.0.1”);
IPEndPoint iep = new IPEndPoint(localip,80);
listBox1.Items.Add(“The IPEndPoint is:” + iep.ToString());
listBox1.Items.Add(“The max port number is:”+IPEndPoint.MaxPort);
listBox1.Items.Add(“The min port number is:”+IPEndPoint.MinPort);
}
Private void buttonRemote_Click(object sender , EventArgs e)
{
listBox1.Items.Clear();
IPHostEntry remoteHost = Dns.GetHostEntry(“https://www.doczj.com/doc/206269147.html,”);
IPAddress[] remoteIP = remoteHost.AddressList;
listBox1.Items.Add(百度:);
foreach(IPAddress ip in remoteIP)
{
IPEndPoint iep = new IPEndPoint(ip,80);
listBox1.Items.Add(iep);
}
}
Socket类包含在https://www.doczj.com/doc/206269147.html,.Sockets命名空间中。Socket类的构造函数为:Public Socket(AddressFamily addressFamily,SocketType SocketType,ProtocolType protocolType);
AddressFamily为网络类型,指定Socket使用的寻址方案,例如AddressFamily.InterNetWork表明为IP版本4的地址;SocketType指定Socket的类型,例如SocketType.Stream表明连接是基于流套接字的,二SocketType.Dgram表示连接是基于数据报套接字的;ProtocolType指定Socket使用的协议,例如ProtocolType.Tcp表
创建套接字实例:
Socket socket = new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocolType.Tcp)
Socket对象的SetSocketOption方法设置套接字的四种重载方法:
Public void SetSocketOption(SocketOptionLevel ol,SocketOptionName on,Boolean value) Public void SetSocketOption(SocketOptionLevel ol,SocketOptionName on,byte[] value)
Public void SetSocketOption(SocketOptionLevel ol,SocketOptionName on,int value)
Public void SetSocketOption(SocketOptionLevel ol,SocketOptionName on,object value)
Value参数指定SocketOptionName的值。例如:
Socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeOut,1000);
面向连接的套接字编程
Bind(IPEndPoint address)Address为IPEndPoint的实例,该实例包括一个本地IP地址和一个端口号。绑定之后开始监听:
Listen(int backlog) backlog参数指出系统等待用户程序服务排队的连接数,超过连接数的任何客户端都不能与服务器进行通信。
当有客户连接进来之后应创建新的Socket套接字进行接收Socket clientSocket = Localsocket.Accept();
接受客户机连接之后,客户机和服务器可以传递数据。
Sock.Shutdown(SocketShutdown.Both);
Sock.Close();
设备1 设备2
无连接套接字编程
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); NetWorkStream networkStream = new NetWorkStream(socket);
一旦构造了一个NetWorkStream对象,就不需要使用Socket对象了。
TcpClient()类的四种重载方法:
1.TcpClient(): TcpClient tcpClient = new TcpClient();
tcpClient.Connect(“https://www.doczj.com/doc/206269147.html,”,51888);
2.TcpClient(AddressFamily family): TcpClient tcpClient = new
TcpClient(AddressFamily.InterNetwork);tcpClient.Connect(“https://www.doczj.com/doc/206269147.html,”,51888)
3.TcpClient(IPEndPoint iep):IPAddress[] address =
Dns.GetHostAddresses(Dns.GetHostName()); IPEndPoint iep = new
IPEndPoint(address[0], 51888); TcpClient tcpClient = new TcpClient(iep);
tcpClient.Connect("https://www.doczj.com/doc/206269147.html,", 51888);
4.TcpClient(string hostname,int port): TcpClient tcpClient=new TcpClient("https://www.doczj.com/doc/206269147.html,",
51888);
TcpListenner类两种重载方法:
1.TcpListener(IPEndPoint iep)
2.TcpListener(IPAddress localAddr,int port)
四种方法:
1.AcceptSocket()
2.AcceptTcpClient()
3.Start()
4.Stop()
解决TCP协议消息边界问题的方法有三种:
1.发送固定长度的消息
2.将消息长度和消息一起发送
3.使用特殊标记分隔符
EndSend 结束挂起的异步发送