日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 域套接字通讯类

發(fā)布時(shí)間:2025/3/8 C# 25 如意码农
生活随笔 收集整理的這篇文章主要介紹了 C# 域套接字通讯类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
public class UdsClient
{
public Socket _socket { get; set; }
public UnixDomainSocketEndPoint endPoint = null;
public SocketInfo socketInfo = null;
public bool _isConnected = false; public delegate void OnConnectedHandler();
public event OnConnectedHandler OnConnected;
public event OnConnectedHandler OnFaildConnect;
public delegate void OnReceiveMsgHandler(string msg);
public event OnReceiveMsgHandler OnReceiveMsg;
public string Msg = ""; public UdsClient(string path)
{
endPoint = new UnixDomainSocketEndPoint(path);
_socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
} public void Start()
{
_socket.BeginConnect(endPoint, ConnectedCallback, _socket);
_isConnected = true;
Thread socketClient = new Thread(SocketClientReceive);
socketClient.IsBackground = true;
socketClient.Start();
} public void DisConnect()
{
_socket.Disconnect(true);
} public void SocketClientReceive()
{
Console.WriteLine("Uds SocketClientReceive begin");
while (_isConnected)
{
if (socketInfo == null)
{
Console.WriteLine("Uds當(dāng)前連接成功,socketInfo null");
try
{
Console.WriteLine("Uds當(dāng)前連接成功,創(chuàng)建接收SocketInfo");
socketInfo = new SocketInfo();
socketInfo.socket = _socket;
_socket.BeginReceive(socketInfo.buffer, 0, socketInfo.buffer.Length, SocketFlags.None, ReceiveCallback, socketInfo);
}
catch
{
_isConnected = false;
socketInfo?.socket?.Close();
socketInfo?.socket?.Dispose();
OnFaildConnect();
}
Console.WriteLine("Uds開(kāi)始異步接收,延時(shí)100ms");
Thread.Sleep(100);
} }
Console.WriteLine("Uds SocketClientReceive end");
} public void ReceiveCallback(IAsyncResult ar)
{
Console.WriteLine("Uds ReceiveCallback begin");
socketInfo = ar.AsyncState as SocketInfo;
int readCount = 0;
try
{
if (socketInfo.socket == null) return;
readCount = socketInfo.socket.EndReceive(ar);
}
catch
{
return;
}
if (readCount > 0)
{
if (readCount < socketInfo.buffer.Length)
{
byte[] newBuffer = new byte[readCount];
Buffer.BlockCopy(socketInfo.buffer, 0, newBuffer, 0, readCount);
socketInfo.msgBuffer = newBuffer;
}
else
{
socketInfo.msgBuffer = socketInfo.buffer;
}
string msgTip = Encoding.UTF8.GetString(socketInfo.msgBuffer);
if (OnReceiveMsg != null) OnReceiveMsg(msgTip);
}
socketInfo.socket.Close();
socketInfo.socket.Dispose();
socketInfo = null;
Console.WriteLine("Uds ReceiveCallback end");
} public void ConnectedCallback(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
if (socket.Connected)
{
if (this.OnConnected != null) OnConnected();
}
else
{
if (this.OnFaildConnect != null) OnFaildConnect();
}
} public void SendMsg(string msg)
{
byte[] buffer = Encoding.UTF8.GetBytes(msg);
_socket.Send(buffer);
} public class SocketInfo
{
public Socket socket = null;
public byte[] buffer = null;
public byte[] msgBuffer = null; public SocketInfo()
{
buffer = new byte[1024 * 4];
}
}
}
public class UdsForControl
{
private static readonly object _lockConnected = new object(); /// <summary>
/// 域套接字客戶端對(duì)象
/// </summary>
private static UdsClient _udsClient = null; /// <summary>
/// 域套接字文件地址
/// </summary>
private static string _path = ""; /// <summary>
/// 域套接字服務(wù)名稱
/// </summary>
private static string _name = ""; static UdsForControl()
{
var path = "UnixPath";
_name = "UnixServer";
//_path = Path.Combine(Path.GetTempPath(), path);
_path = path;
} public static void ConnectUdsServer()
{
lock (_lockConnected)
{
if (_udsClient == null)
{
var flag = true;
if (flag)
{
try
{
_udsClient = new UdsClient(_path);
_udsClient.OnConnected += _udsClient_OnConnected;
_udsClient.OnFaildConnect += _udsClient_OnFaildConnect;
_udsClient.OnReceiveMsg += _udsClient_OnReceiveMsg;
_udsClient.Start();
}
catch (Exception ex)
{
Console.WriteLine($"{_name}服務(wù)連接過(guò)程出現(xiàn)異常:{ex.Message}");
_udsClient_OnFaildConnect();
} } }
} } private static void _udsClient_OnFaildConnect()
{
lock (_lockConnected)
{
var flag = PublicMethod.GetConfigValue<bool>("UseUps");
if (flag)
{
Console.WriteLine($"{_name}服務(wù)斷線");
}
if (_udsClient != null)
{
Console.WriteLine($"Uds服務(wù)斷線,清理對(duì)象 _udsClient");
Clear(_udsClient);
}
if (BaseRepository.udsClient != null)
{
Console.WriteLine($"Uds服務(wù)斷線,清理對(duì)象 udsClient");
Clear(BaseRepository.udsClient);
}
}
} private static void Clear(UdsClient udsClient)
{
Console.WriteLine($"Uds服務(wù)斷線,Clear Begin");
//udsClient?._socket?.Shutdown(System.Net.Sockets.SocketShutdown.Both);
udsClient?._socket?.Close();
udsClient?._socket?.Dispose();
//udsClient?.socketInfo?.socket?.Shutdown(System.Net.Sockets.SocketShutdown.Both);
udsClient?.socketInfo?.socket?.Close();
udsClient?.socketInfo?.socket?.Dispose();
udsClient = null;
Console.WriteLine($"Uds服務(wù)斷線,Clear End");
} private static void _udsClient_OnConnected()
{
Console.WriteLine($"{_name}服務(wù)連接成功");
BaseRepository.udsClient = _udsClient;
} private static void _udsClient_OnReceiveMsg(string msg)
{
Console.WriteLine($"接收到{_name}消息:{msg}");
}
}

總結(jié)

以上是生活随笔為你收集整理的C# 域套接字通讯类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。