using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace BatteryDetectWorkA
{
class SocketClient
{
byte[] buffer = new byte[2048];
Socket socket;
Thread thread;
string ip, port;
public bool connect(string ip, string port)
{
bool result = true;
try
{
//实例化socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
this.ip = ip; this.port = port;
socket.Connect(new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(this.port))); thread = new Thread(StartReceive);
thread.IsBackground = true;
thread.Start(socket);
}
catch (Exception ex)
{
//SetMessage("连接服务器异常:" + ex.Message);
result = false;
}
return result;
} private void StartReceive(object obj)
{
string str;
while (true)
{
Socket receiveSocket = obj as Socket;
try
{
int result = receiveSocket.Receive(buffer);
if (result == 0)
{
break;
}
else
{
str = Encoding.Default.GetString(buffer); } }
catch (Exception ex)
{
//SetMessage("服务器异常:" + ex.Message); }
} } /// <summary>
/// 关闭连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public bool close()
{
bool result = true;
try
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket.Dispose();
thread.Abort();
socket = null;
thread = null;
GC.Collect();
}
catch (Exception ex)
{
result = false;
}
return result;
} public void send(string str)
{
socket.Send(Encoding.Default.GetBytes(str));
} public void sendbytes(byte[] buffer)
{
socket.Send(buffer);
} public bool isConnection()
{ bool blockingState = socket.Blocking;
try
{
if (!socket.Connected)
{
try
{
close();
connect(this.ip, this.port);
}
catch (Exception ex)
{
return false;
}
}
byte[] tmp = new byte[1];
socket.Blocking = false;
socket.Send(tmp, 0, 0);
socket.Blocking = blockingState; // 恢复状态
return true;
}
catch (SocketException e)
{
//try
//{
// // socket.Close();
// socket.Connect(new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(this.port)));
//}
//catch(Exception ex) { }
// 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
//if (e.NativeErrorCode.Equals(10035))
return false;
//else
// return true;
}
//finally
//{
// socket.Blocking = blockingState; // 恢复状态
//} } } class SocketServer
{
private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();
public SocketServer(string ip, string port)
{
try
{ Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port));
//绑定ip和端口
socket.Bind(IEP);
//开启监听
socket.Listen(20);
//Logger.WriteLog(ip + ':' + port + "开始监听"); Thread thread = new Thread(new ParameterizedThreadStart(StartServer));
thread.IsBackground = true;
thread.Start(socket); }
catch (Exception ex)
{
// Logger.WriteLog(ex.Message.ToString(), ex); }
} public void StartServer(object obj)
{
string str;
while (true)
{
//等待接收客户端连接 Accept方法返回一个用于和该客户端通信的Socket
Socket recviceSocket = ((Socket)obj).Accept();
//获取客户端ip和端口号
str = recviceSocket.RemoteEndPoint.ToString();
socketList.Add(str, recviceSocket);
//Logger.LogOperate.Info(str + "已连接"); //Accept()执行过后 当前线程会阻塞 只有在有客户端连接时才会继续执行
//创建新线程,监控接收新客户端的请求数据
Thread thread = new Thread(startRecive);
thread.IsBackground = true;
thread.Start(recviceSocket);
}
} public void startRecive(object obj)
{ while (true)
{
try
{
byte[] buffer = new byte[2048];
int count = ((Socket)obj).Receive(buffer);
if (count == 0) break;
string str = Encoding.Default.GetString(buffer, 0, count);
string ip = ((Socket)obj).RemoteEndPoint.ToString(); }
catch (Exception ex)
{
// Logger.WriteLog(ex.Message.ToString(), ex); }
}
}
private void send2Client(string ip, string str)
{
byte[] bytes = new byte[2048];
bytes = Encoding.Default.GetBytes(str);
if (socketList.ContainsKey(ip))
{
Logger.QuiesceThread(new Action(() => {
try
{
socketList[ip].Send(bytes);
}
catch (Exception ex)
{ }
}));
} } } public class TcpClient
{ Socket m_client; byte[] buffer = new byte[3072 * 2048];
bool isOpen = false;
bool hasClient = false; bool check_client()
{
try
{
if (m_client == null)
return false; bool isConnect = !(m_client.Poll(1000, SelectMode.SelectRead) && m_client.Available == 0) && m_client.Connected;
return isConnect;
}
catch
{
return false;
}
} void AcceptCallBack(IAsyncResult ar)
{
try
{
if (check_client())
{
m_client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), m_client);
hasClient = true;
while (hasClient)
{
Thread.Sleep(500);
if (!check_client())
{
break;
}
}
hasClient = false;
Logger.LogApp.Info("监听到Socket断线");
}
if (isOpen)
Open();
}
catch
{
}
}
void ReceiveCallBack(IAsyncResult ar)
{
try
{
var client = ar.AsyncState as Socket;
int length = client.EndReceive(ar);
if (length > 0)
OnDataRecive?.Invoke(buffer.Take(length).ToArray()); //接收一下个信息
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), client);
}
catch (Exception ex) { }
} public event Action<byte[]> OnDataRecive;
string m_ip;
int m_port;
public void Open(string ip, int port)
{
//
Close(); //
IPEndPoint serverip = new IPEndPoint(IPAddress.Parse(ip), port);
m_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_client.BeginConnect(serverip, AcceptCallBack, m_client); //
isOpen = true;
m_ip = ip;
m_port = port;
}
public void Open()
{
Open(m_ip, m_port);
}
public void Close()
{
//
if (m_client != null)
{
if (m_client.Connected)
m_client.Shutdown(SocketShutdown.Both);
m_client.Close();
m_client = null;
} //
hasClient = false;
isOpen = false;
}
public bool IsOpen()
{
return isOpen;
}
public bool IsConnected()
{
return hasClient;
} public void Send(byte[] data)
{
if (hasClient)
{
m_client.Send(data);
}
} public void Send(string str)
{
if (hasClient)
{
m_client.Send(Encoding.Default.GetBytes(str));
Logger.LogApp.Info("A工位通过Socket发送" + str.ToString());
}
else
{
Logger.LogApp.Info("Socket断线,数据未发送,数据为" + str.ToString());
}
} } class TcpServer
{ Socket m_server;
Socket m_client; byte[] buffer = new byte[1024];
bool isOpen = false;
bool hasClient = false; bool check_client()
{
try
{
if (m_client == null)
return false; bool isConnect = !(m_client.Poll(1000, SelectMode.SelectRead) && m_client.Available == 0) && m_client.Connected;
return isConnect;
}
catch
{
return false;
}
} void AcceptCallBack(IAsyncResult ar)
{
try
{
var server = ar.AsyncState as Socket;
var client = server.EndAccept(ar);
m_client = client;
m_client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), m_client); hasClient = true;
while (true)
{
Thread.Sleep(100);
if (!check_client())
{
if (m_client.Connected)
m_client.Shutdown(SocketShutdown.Both);
m_client.Close();
m_client = null;
break;
}
}
hasClient = false; if (m_server != null)
{
m_server.BeginAccept(new AsyncCallback(AcceptCallBack), m_server);
}
}
catch { }
}
void ReceiveCallBack(IAsyncResult ar)
{
try
{
var client = ar.AsyncState as Socket;
int length = client.EndReceive(ar);
OnDataRecive?.Invoke(buffer.Take(length).ToArray()); //接收一下个信息
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), client);
}
catch { }
} public event Action<byte[]> OnDataRecive; public void Open(string ip, int port)
{ //
Close(); //
IPEndPoint serverip = new IPEndPoint(IPAddress.Parse(ip), port);
m_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_server.Bind(serverip);
m_server.Listen(0);
m_server.BeginAccept(new AsyncCallback(AcceptCallBack), m_server); //
isOpen = true;
}
public void Close()
{ //
hasClient = false;
isOpen = false; //
if (m_server != null)
{
if (m_server.Connected)
m_server.Shutdown(SocketShutdown.Both);
m_server.Close();
m_server = null;
} //
if (m_client != null)
{
if (m_client.Connected)
m_client.Shutdown(SocketShutdown.Both);
m_client.Close();
m_client = null;
} }
public bool IsOpen()
{
return isOpen;
}
public bool IsConnected()
{
return hasClient;
} public void Send(byte[] data)
{
if (hasClient)
{
m_client.Send(data);
}
} } }

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using System.Net;using System.Threading;
namespace BatteryDetectWorkA{    class SocketClient    {        byte[] buffer = new byte[2048];        Socket socket;        Thread thread;        string ip, port;        public bool connect(string ip, string port)        {            bool result = true;            try            {                //实例化socket                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                //连接服务器                this.ip = ip; this.port = port;                socket.Connect(new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(this.port)));
                thread = new Thread(StartReceive);                thread.IsBackground = true;                thread.Start(socket);            }            catch (Exception ex)            {                //SetMessage("连接服务器异常:" + ex.Message);                result = false;            }            return result;        }
        private void StartReceive(object obj)        {            string str;            while (true)            {                Socket receiveSocket = obj as Socket;                try                {                    int result = receiveSocket.Receive(buffer);                    if (result == 0)                    {                        break;                    }                    else                    {                        str = Encoding.Default.GetString(buffer);
                    }
                }                catch (Exception ex)                {                    //SetMessage("服务器异常:" + ex.Message);
                }            }
        }
        /// <summary>        /// 关闭连接        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        public bool close()        {            bool result = true;            try            {                socket.Shutdown(SocketShutdown.Both);                socket.Close();                socket.Dispose();                thread.Abort();                socket = null;                thread = null;                GC.Collect();            }            catch (Exception ex)            {                result = false;            }            return result;        }
        public void send(string str)        {            socket.Send(Encoding.Default.GetBytes(str));        }
        public void sendbytes(byte[] buffer)        {            socket.Send(buffer);        }
        public bool isConnection()        {
            bool blockingState = socket.Blocking;            try            {                if (!socket.Connected)                {                    try                    {                        close();                        connect(this.ip, this.port);                    }                    catch (Exception ex)                    {                        return false;                    }                }                byte[] tmp = new byte[1];                socket.Blocking = false;                socket.Send(tmp, 0, 0);                socket.Blocking = blockingState;    // 恢复状态                return true;            }            catch (SocketException e)            {                //try                //{                //   // socket.Close();                //    socket.Connect(new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(this.port)));                //}                //catch(Exception ex) { }                // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的                //if (e.NativeErrorCode.Equals(10035))                return false;                //else                //    return true;            }            //finally            //{            //    socket.Blocking = blockingState;    // 恢复状态            //}
        }
    }
    class SocketServer    {        private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();        public SocketServer(string ip, string port)        {            try            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port));                //绑定ip和端口                socket.Bind(IEP);                //开启监听                socket.Listen(20);                //Logger.WriteLog(ip + ':' + port + "开始监听");
                Thread thread = new Thread(new ParameterizedThreadStart(StartServer));                thread.IsBackground = true;                thread.Start(socket);
            }            catch (Exception ex)            {                // Logger.WriteLog(ex.Message.ToString(), ex);
            }        }
        public void StartServer(object obj)        {            string str;            while (true)            {                //等待接收客户端连接 Accept方法返回一个用于和该客户端通信的Socket                Socket recviceSocket = ((Socket)obj).Accept();                //获取客户端ip和端口号                str = recviceSocket.RemoteEndPoint.ToString();                socketList.Add(str, recviceSocket);                //Logger.LogOperate.Info(str + "已连接");
                //Accept()执行过后 当前线程会阻塞 只有在有客户端连接时才会继续执行                //创建新线程,监控接收新客户端的请求数据                Thread thread = new Thread(startRecive);                thread.IsBackground = true;                thread.Start(recviceSocket);            }        }

        public void startRecive(object obj)        {
            while (true)            {                try                {                    byte[] buffer = new byte[2048];                    int count = ((Socket)obj).Receive(buffer);                    if (count == 0) break;                    string str = Encoding.Default.GetString(buffer, 0, count);                    string ip = ((Socket)obj).RemoteEndPoint.ToString();
                }                catch (Exception ex)                {                    // Logger.WriteLog(ex.Message.ToString(), ex);
                }            }        }        private void send2Client(string ip, string str)        {            byte[] bytes = new byte[2048];            bytes = Encoding.Default.GetBytes(str);            if (socketList.ContainsKey(ip))            {                Logger.QuiesceThread(new Action(() => {                    try                    {                        socketList[ip].Send(bytes);                    }                    catch (Exception ex)                    { }                }));            }
        }

    }
    public class TcpClient    {
        Socket m_client;
        byte[] buffer = new byte[3072 * 2048];        bool isOpen = false;        bool hasClient = false;
        bool check_client()        {            try            {                if (m_client == null)                    return false;
                bool isConnect = !(m_client.Poll(1000, SelectMode.SelectRead) && m_client.Available == 0) && m_client.Connected;                return isConnect;            }            catch            {                return false;            }        }
        void AcceptCallBack(IAsyncResult ar)        {            try            {                if (check_client())                {                    m_client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), m_client);                    hasClient = true;                    while (hasClient)                    {                        Thread.Sleep(500);                        if (!check_client())                        {                            break;                        }                    }                    hasClient = false;                    Logger.LogApp.Info("监听到Socket断线");                }                if (isOpen)                    Open();            }            catch            {            }        }        void ReceiveCallBack(IAsyncResult ar)        {            try            {                var client = ar.AsyncState as Socket;                int length = client.EndReceive(ar);                if (length > 0)                    OnDataRecive?.Invoke(buffer.Take(length).ToArray());
                //接收一下个信息                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), client);            }            catch (Exception ex) { }        }
        public event Action<byte[]> OnDataRecive;        string m_ip;        int m_port;        public void Open(string ip, int port)        {            //            Close();
            //            IPEndPoint serverip = new IPEndPoint(IPAddress.Parse(ip), port);            m_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            m_client.BeginConnect(serverip, AcceptCallBack, m_client);
            //            isOpen = true;            m_ip = ip;            m_port = port;        }        public void Open()        {            Open(m_ip, m_port);        }        public void Close()        {            //            if (m_client != null)            {                if (m_client.Connected)                    m_client.Shutdown(SocketShutdown.Both);                m_client.Close();                m_client = null;            }
            //            hasClient = false;            isOpen = false;        }        public bool IsOpen()        {            return isOpen;        }        public bool IsConnected()        {            return hasClient;        }
        public void Send(byte[] data)        {            if (hasClient)            {                m_client.Send(data);            }        }
        public void Send(string str)        {            if (hasClient)            {                m_client.Send(Encoding.Default.GetBytes(str));                Logger.LogApp.Info("A工位通过Socket发送" + str.ToString());            }            else            {                Logger.LogApp.Info("Socket断线,数据未发送,数据为" + str.ToString());            }        }
    }

    class TcpServer    {
        Socket m_server;        Socket m_client;
        byte[] buffer = new byte[1024];        bool isOpen = false;        bool hasClient = false;
        bool check_client()        {            try            {                if (m_client == null)                    return false;
                bool isConnect = !(m_client.Poll(1000, SelectMode.SelectRead) && m_client.Available == 0) && m_client.Connected;                return isConnect;            }            catch            {                return false;            }        }
        void AcceptCallBack(IAsyncResult ar)        {            try            {                var server = ar.AsyncState as Socket;                var client = server.EndAccept(ar);                m_client = client;                m_client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), m_client);
                hasClient = true;                while (true)                {                    Thread.Sleep(100);                    if (!check_client())                    {                        if (m_client.Connected)                            m_client.Shutdown(SocketShutdown.Both);                        m_client.Close();                        m_client = null;                        break;                    }                }                hasClient = false;
                if (m_server != null)                {                    m_server.BeginAccept(new AsyncCallback(AcceptCallBack), m_server);                }            }            catch { }        }        void ReceiveCallBack(IAsyncResult ar)        {            try            {                var client = ar.AsyncState as Socket;                int length = client.EndReceive(ar);                OnDataRecive?.Invoke(buffer.Take(length).ToArray());
                //接收一下个信息                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), client);            }            catch { }        }
        public event Action<byte[]> OnDataRecive;
        public void Open(string ip, int port)        {
            //            Close();
            //            IPEndPoint serverip = new IPEndPoint(IPAddress.Parse(ip), port);            m_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            m_server.Bind(serverip);            m_server.Listen(0);            m_server.BeginAccept(new AsyncCallback(AcceptCallBack), m_server);
            //            isOpen = true;        }        public void Close()        {
            //            hasClient = false;            isOpen = false;
            //            if (m_server != null)            {                if (m_server.Connected)                    m_server.Shutdown(SocketShutdown.Both);                m_server.Close();                m_server = null;            }
            //            if (m_client != null)            {                if (m_client.Connected)                    m_client.Shutdown(SocketShutdown.Both);                m_client.Close();                m_client = null;            }
        }        public bool IsOpen()        {            return isOpen;        }        public bool IsConnected()        {            return hasClient;        }
        public void Send(byte[] data)        {            if (hasClient)            {                m_client.Send(data);            }        }
    }
}

2021-6-16 TcpIp的更多相关文章

  1. 2021.12.16 eleveni的刷题记录

    2021.12.16 eleveni的刷题记录 1. 数论 https://www.luogu.com.cn/problem/P2532 1.1卡特兰数 https://www.luogu.com.c ...

  2. 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

    2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...

  3. 2021.08.16 P1260 工程规划(差分约束)

    2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...

  4. 2021.08.16 P1078 文化之旅(最短路)

    2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...

  5. 2021.08.16 P1300 城市街道交通费系统(dfs)

    2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...

  6. 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

    2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...

  7. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  8. Noip模拟54 2021.9.16

    T1 选择 现在发现好多题目都是隐含的状压,不明面给到数据范围里,之凭借一句话 比如这道题就是按照题目里边给的儿子数量不超过$10$做状压,非常邪门 由于数据范围比较小,怎么暴力就怎么来 从叶子节点向 ...

  9. Noip模拟41 2021.8.16

    T1 你相信引力吗 对于区间的大小关系问题,往往使用单调栈来解决 这道题的优弧和劣弧很烦,考虑将其等价的转化 由于所有的合法情况绕过的弧都不会经过最高的冰锥, 又因为环可以任意亲定起点,这样可以直接把 ...

  10. Noip模拟17 2021.7.16

    我愿称这场考试为STL专练 T1 世界线 巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的. 但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但 ...

随机推荐

  1. oss/obs对象存储上传图片,在浏览器输入地址却是下载图片。不能直接在浏览器上查看。

    1.问题oss/obs对象存储上传图片获取链接地址后,在浏览器输入地址却是下载.不能直接在浏览器上面浏览图片信息.2.解决上传文件的时候需要设置:content-type类型,需要指示浏览器这是什么类 ...

  2. 【故障公告】被放出的 Bing 爬虫,又被爬宕机的园子

    这些巨头爬虫们现在怎么了?记忆中2022年之前的十几年,园子没有遇到过被巨头爬虫们爬宕机的情况,巨头们都懂得爱护,都懂得控制节奏,都懂得在爬网时控制并发连接数以免给目标网站造成过大压力. 从去年开始, ...

  3. [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测

    文章目录 [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测 一.模型持久化 1.持久化代码实现 convert_variables_to_constants固化模型结 ...

  4. 2020-10-03:java中satb和tlab有什么区别?

    福哥答案2020-10-03:#福大大架构师每日一题# 简单回答:satb: snapshot-at-the-beginning,快照.tlab:thread local allocation buf ...

  5. vue全家桶进阶之路15:自定义指令

    Vue 2.x 中的自定义指令是一种可以用于扩展 Vue.js 核心功能的特性.指令可以用于操作 DOM 元素的属性.监听 DOM 事件.控制 DOM 行为等等,可以将常见的交互行为封装成指令,从而让 ...

  6. 这款全自动自适应工具你用过了吗?autofit.js请求加入你的战场!

    前段时间做了一个自适应的小工具(autofit.js) 经过一段时间的试用,同学们发现了工具存在的一些问题,我自己也发现了一些,这篇文章是针对这些问题撰写的. autofit.js autofit.j ...

  7. 计算机网络 VRRP和DHCP

    目录 一.vrrp概念 二.vrrp工作过程 三.vrrp优先级 四.vrrp实验 五.DHCP概念 六.DHCP工作过程 七.DHCP实验 一.vrrp概念 概念:称虚拟路由器冗余协议,当网关路由器 ...

  8. weex项目使用iconfont 字体图标

    一.使用本地字体图标 1.在 https://www.iconfont.cn/manage/index 注册自己的账号 2.创建自己的项目 3.添加自己需要的图标,并将其下载到本地 4.入口页面引入 ...

  9. Redis系列13:分布式锁实现

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  10. CANoe工具的安装

    CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment,用于分析和模拟CAN(Controller Area Network)和LIN ...