using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Mail;
using System.Net;
namespace DotNet.Utilities
{
///
/// 网络操作相关的类
///
public class NetHelper
{
#region 检查设置的IP地址是否正确,返回正确的IP地址
///
/// 检查设置的IP地址是否正确,并返回正确的IP地址,无效IP地址返回"-1"。
///
/// 设置的IP地址
//public static string GetValidIP(string ip)
//{
// if (PageValidate.IsIP(ip))
// {
// return ip;
// }
// else
// {
// return "-1";
// }
//}
#endregion
#region 检查设置的端口号是否正确,返回正确的端口号
///
/// 检查设置的端口号是否正确,并返回正确的端口号,无效端口号返回-1。
///
/// 设置的端口号
public static int GetValidPort(string port)
{
//声明返回的正确端口号
int validPort = -1;
//最小有效端口号
const int MINPORT = 0;
//最大有效端口号
const int MAXPORT = 65535;
//检测端口号
try
{
//传入的端口号为空则抛出异常
if (port == "")
{
throw new Exception("端口号不能为空!");
}
//检测端口范围
if ((Convert.ToInt32(port)
{
throw new Exception("端口号范围无效!");
}
//为端口号赋值
validPort = Convert.ToInt32(port);
}
catch (Exception ex)
{
string errMessage = ex.Message;
}
return validPort;
}
#endregion
#region 将字符串形式的IP地址转换成IPAddress对象
///
/// 将字符串形式的IP地址转换成IPAddress对象
///
/// 字符串形式的IP地址
public static IPAddress StringToIPAddress(string ip)
{
return IPAddress.Parse(ip);
}
#endregion
#region 获取本机的计算机名
///
/// 获取本机的计算机名
///
public static string LocalHostName
{
get
{
return Dns.GetHostName();
}
}
#endregion
#region 获取本机的局域网IP
///
/// 获取本机的局域网IP
///
public static string LANIP
{
get
{
//获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP
IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
//如果本机IP列表为空,则返回空字符串
if (addressList.Length <1)
{
return "";
}
//返回本机的局域网IP
return addressList[0].ToString();
}
}
#endregion
#region 获取本机在Internet网络的广域网IP
///
/// 获取本机在Internet网络的广域网IP
///
public static string WANIP
{
get
{
//获取本机的IP列表,IP列表中的第一项是局域网IP&#xff0c;第二项是广域网IP
IPAddress[] addressList &#61; Dns.GetHostEntry(Dns.GetHostName()).AddressList;
//如果本机IP列表小于2&#xff0c;则返回空字符串
if (addressList.Length <2)
{
return "";
}
//返回本机的广域网IP
return addressList[1].ToString();
}
}
#endregion
#region 获取远程客户机的IP地址
///
/// 获取远程客户机的IP地址
///
/// 客户端的socket对象
public static string GetClientIP(Socket clientSocket)
{
IPEndPoint client &#61; (IPEndPoint)clientSocket.RemoteEndPoint;
return client.Address.ToString();
}
#endregion
#region 创建一个IPEndPoint对象
///
/// 创建一个IPEndPoint对象
///
/// IP地址
/// 端口号
public static IPEndPoint CreateIPEndPoint(string ip, int port)
{
IPAddress ipAddress &#61; StringToIPAddress(ip);
return new IPEndPoint(ipAddress, port);
}
#endregion
#region 创建一个TcpListener对象
///
/// 创建一个自动分配IP和端口的TcpListener对象
///
public static TcpListener CreateTcpListener()
{
//创建一个自动分配的网络节点
IPAddress ipAddress &#61; IPAddress.Any;
IPEndPoint localEndPoint &#61; new IPEndPoint(ipAddress, 0);
return new TcpListener(localEndPoint);
}
///
/// 创建一个TcpListener对象
///
/// IP地址
/// 端口
public static TcpListener CreateTcpListener(string ip, int port)
{
//创建一个网络节点
IPAddress ipAddress &#61; StringToIPAddress(ip);
IPEndPoint localEndPoint &#61; new IPEndPoint(ipAddress, port);
return new TcpListener(localEndPoint);
}
#endregion
#region 创建一个基于TCP协议的Socket对象
///
/// 创建一个基于TCP协议的Socket对象
///
public static Socket CreateTcpSocket()
{
return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
#endregion
#region 创建一个基于UDP协议的Socket对象
///
/// 创建一个基于UDP协议的Socket对象
///
public static Socket CreateUdpSocket()
{
return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
}
#endregion
#region 获取本地终结点
#region 获取TcpListener对象的本地终结点
///
/// 获取TcpListener对象的本地终结点
///
/// TcpListener对象
public static IPEndPoint GetLocalPoint(TcpListener tcpListener)
{
return (IPEndPoint)tcpListener.LocalEndpoint;
}
///
/// 获取TcpListener对象的本地终结点的IP地址
///
/// TcpListener对象
public static string GetLocalPoint_IP(TcpListener tcpListener)
{
IPEndPoint localEndPoint &#61; (IPEndPoint)tcpListener.LocalEndpoint;
return localEndPoint.Address.ToString();
}
///
/// 获取TcpListener对象的本地终结点的端口号
///
/// TcpListener对象
public static int GetLocalPoint_Port(TcpListener tcpListener)
{
IPEndPoint localEndPoint &#61; (IPEndPoint)tcpListener.LocalEndpoint;
return localEndPoint.Port;
}
#endregion
#region 获取Socket对象的本地终结点
///
/// 获取Socket对象的本地终结点
///
/// Socket对象
public static IPEndPoint GetLocalPoint(Socket socket)
{
return (IPEndPoint)socket.LocalEndPoint;
}
///
/// 获取Socket对象的本地终结点的IP地址
///
/// Socket对象
public static string GetLocalPoint_IP(Socket socket)
{
IPEndPoint localEndPoint &#61; (IPEndPoint)socket.LocalEndPoint;
return localEndPoint.Address.ToString();
}
///
/// 获取Socket对象的本地终结点的端口号
///
/// Socket对象
public static int GetLocalPoint_Port(Socket socket)
{
IPEndPoint localEndPoint &#61; (IPEndPoint)socket.LocalEndPoint;
return localEndPoint.Port;
}
#endregion
#endregion
#region 绑定终结点
///
/// 绑定终结点
///
/// Socket对象
/// 要绑定的终结点
public static void BindEndPoint(Socket socket, IPEndPoint endPoint)
{
if (!socket.IsBound)
{
socket.Bind(endPoint);
}
}
///
/// 绑定终结点
///
/// Socket对象
/// 服务器IP地址
/// 服务器端口
public static void BindEndPoint(Socket socket, string ip, int port)
{
//创建终结点
IPEndPoint endPoint &#61; CreateIPEndPoint(ip, port);
//绑定终结点
if (!socket.IsBound)
{
socket.Bind(endPoint);
}
}
#endregion
#region 指定Socket对象执行监听
///
/// 指定Socket对象执行监听&#xff0c;默认允许的最大挂起连接数为100
///
/// 执行监听的Socket对象
/// 监听的端口号
public static void StartListen(Socket socket, int port)
{
//创建本地终结点
IPEndPoint localPoint &#61; CreateIPEndPoint(NetHelper.LocalHostName, port);
//绑定到本地终结点
BindEndPoint(socket, localPoint);
//开始监听
socket.Listen(100);
}
///
/// 指定Socket对象执行监听
///
/// 执行监听的Socket对象
/// 监听的端口号
/// 允许的最大挂起连接数
public static void StartListen(Socket socket, int port, int maxConnection)
{
//创建本地终结点
IPEndPoint localPoint &#61; CreateIPEndPoint(NetHelper.LocalHostName, port);
//绑定到本地终结点
BindEndPoint(socket, localPoint);
//开始监听
socket.Listen(maxConnection);
}
///
/// 指定Socket对象执行监听
///
/// 执行监听的Socket对象
/// 监听的IP地址
/// 监听的端口号
/// 允许的最大挂起连接数
public static void StartListen(Socket socket, string ip, int port, int maxConnection)
{
//绑定到本地终结点
BindEndPoint(socket, ip, port);
//开始监听
socket.Listen(maxConnection);
}
#endregion
#region 连接到基于TCP协议的服务器
///
/// 连接到基于TCP协议的服务器,连接成功返回true&#xff0c;否则返回false
///
/// Socket对象
/// 服务器IP地址
/// 服务器端口号
public static bool Connect(Socket socket, string ip, int port)
{
try
{
//连接服务器
socket.Connect(ip, port);
//检测连接状态
return socket.Poll(-1, SelectMode.SelectWrite);
}
catch (SocketException ex)
{
throw new Exception(ex.Message);
//LogHelper.WriteTraceLog(TraceLogLevel.Error, ex.Message);
}
}
#endregion
#region 以同步方式发送消息
///
/// 以同步方式向指定的Socket对象发送消息
///
/// socket对象
/// 发送的消息
public static void SendMsg(Socket socket, byte[] msg)
{
//发送消息
socket.Send(msg, msg.Length, SocketFlags.None);
}
///
/// 使用UTF8编码格式以同步方式向指定的Socket对象发送消息
///
/// socket对象
/// 发送的消息
public static void SendMsg(Socket socket, string msg)
{
//将字符串消息转换成字符数组
byte[] buffer &#61; ConvertHelper.StringToBytes(msg, Encoding.Default);
//发送消息
socket.Send(buffer, buffer.Length, SocketFlags.None);
}
#endregion
#region 以同步方式接收消息
///
/// 以同步方式接收消息
///
/// socket对象
/// 接收消息的缓冲区
public static void ReceiveMsg(Socket socket, byte[] buffer)
{
socket.Receive(buffer);
}
///
/// 以同步方式接收消息&#xff0c;并转换为UTF8编码格式的字符串,使用5000字节的默认缓冲区接收。
///
/// socket对象
public static string ReceiveMsg(Socket socket)
{
//定义接收缓冲区
byte[] buffer &#61; new byte[5000];
//接收数据&#xff0c;获取接收到的字节数
int receiveCount &#61; socket.Receive(buffer);
//定义临时缓冲区
byte[] tempBuffer &#61; new byte[receiveCount];
//将接收到的数据写入临时缓冲区
Buffer.BlockCopy(buffer, 0, tempBuffer, 0, receiveCount);
//转换成字符串&#xff0c;并将其返回
return ConvertHelper.BytesToString(tempBuffer, Encoding.Default);
}
#endregion
#region 关闭基于Tcp协议的Socket对象
///
/// 关闭基于Tcp协议的Socket对象
///
/// 要关闭的Socket对象
public static void Close(Socket socket)
{
try
{
//禁止Socket对象接收和发送数据
socket.Shutdown(SocketShutdown.Both);
}
catch (SocketException ex)
{
throw ex;
}
finally
{
//关闭Socket对象
socket.Close();
}
}
#endregion
#region 发送电子邮件
///
/// 发送电子邮件,所有SMTP配置信息均在config配置文件中system.net节设置.
///
/// 接收电子邮件的地址
/// 电子邮件的标题
/// 电子邮件的正文
/// 是否开启SSL
public static bool SendEmail(string receiveEmail, string msgSubject, string msgBody, bool IsEnableSSL)
{
//创建电子邮件对象
MailMessage email &#61; new MailMessage();
//设置接收人的电子邮件地址
email.To.Add(receiveEmail);
//设置邮件的标题
email.Subject &#61; msgSubject;
//设置邮件的正文
email.Body &#61; msgBody;
//设置邮件为HTML格式
email.IsBodyHtml &#61; true;
//创建SMTP客户端&#xff0c;将自动从配置文件中获取SMTP服务器信息
SmtpClient smtp &#61; new SmtpClient();
//开启SSL
smtp.EnableSsl &#61; IsEnableSSL;
try
{
//发送电子邮件
smtp.Send(email);
return true;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}
}