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当前连接成功,socketInfo null");
try
{
Console.WriteLine("Uds当前连接成功,创建接收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开始异步接收,延时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>
/// 域套接字客户端对象
/// </summary>
private static UdsClient _udsClient = null; /// <summary>
/// 域套接字文件地址
/// </summary>
private static string _path = ""; /// <summary>
/// 域套接字服务名称
/// </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}服务连接过程出现异常:{ex.Message}");
_udsClient_OnFaildConnect();
} } }
} } private static void _udsClient_OnFaildConnect()
{
lock (_lockConnected)
{
var flag = PublicMethod.GetConfigValue<bool>("UseUps");
if (flag)
{
Console.WriteLine($"{_name}服务断线");
}
if (_udsClient != null)
{
Console.WriteLine($"Uds服务断线,清理对象 _udsClient");
Clear(_udsClient);
}
if (BaseRepository.udsClient != null)
{
Console.WriteLine($"Uds服务断线,清理对象 udsClient");
Clear(BaseRepository.udsClient);
}
}
} private static void Clear(UdsClient udsClient)
{
Console.WriteLine($"Uds服务断线,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服务断线,Clear End");
} private static void _udsClient_OnConnected()
{
Console.WriteLine($"{_name}服务连接成功");
BaseRepository.udsClient = _udsClient;
} private static void _udsClient_OnReceiveMsg(string msg)
{
Console.WriteLine($"接收到{_name}消息:{msg}");
}
}

C# 域套接字通讯类的更多相关文章

  1. UNIX网络编程——UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  2. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  3. 通过UNIX域套接字传递描述符的应用

      传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程 ...

  4. UNIX域套接字(unix domain)

    UNIX域套接字用于在同一台机器上运行的进程之间的通信. UNIX域套接字提供流和数据报两种接口. 说明:UNIX域套接字比因特网套接字效率更高.它仅赋值数据:不进行协议处理,如添加或删除网络报头.计 ...

  5. 高级进程间通信之UNIX域套接字

    UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...

  6. 基于 Paramiko 的 SSH 通讯类

    # -*- coding: UTF-8 -*-import paramikoimport time################################################### ...

  7. 《网络编程》Unix 域套接字

    概述 Unix 域套接字是一种client和server在单主机上的 IPC 方法.Unix 域套接字不运行协议处理,不须要加入或删除网络报头,无需验证和,不产生顺序号,无需发送确认报文,比因特网域套 ...

  8. unix域套接字UDP网络编程

    unix域套接字UDP网络编程,服务器如下面: #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  9. UNIX网络编程——通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

    在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #in ...

  10. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

随机推荐

  1. 2024年1月Java项目开发指南18:自定义异常输出

    一般情况下,报错信息一大堆,值得注意的只有三个地方: 哪个文件发生了错误 哪一行发生了错误 错误原因是什么 只要知道这三个东西就能快速的定位到错误发生的位置并且根据提示解决. 如果你也喜欢我的这种异常 ...

  2. 【转载】用shell命令一步步获取Java版本号

    https://blog.csdn.net/f20052604/article/details/100269768 1.打印java -version命令echo $(java -version)输出 ...

  3. Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

    一.前言 为什么需要判断视频文件是否含有B帧,这个在推流的时候很容易遇到这个问题,一般来说,没有B帧的视频文件,解码后的数据帧pts和dts都是顺序递增的,而有B帧的则未必,可能有些需要先解码后面显示 ...

  4. Qt编写安防视频监控系统23-图片地图

    一.前言 图片地图这个模块是后面新增加进去的,主要是安防领域还有很多应用场景是一个区域比如就一个学校,提供一个学校的平面图或者鸟瞰图,然后在该地图上放置对应的摄像机,双击该摄像机图标可以查看对应的实时 ...

  5. Qt开发经验小技巧161-165

    经常有人说Qt垃圾,说用Qt在1毫秒绘制几千个数据点卡成屎.其实显示器最高刷新频率一般才60帧,1毫秒就绘制一次有意义吗?不仅显示器没刷新过来,人肉眼也看不过来(有人可能又要抬杠说这是老板要求的,显示 ...

  6. Qt编写安防视频监控系统43-图片回放

    一.前言 之前就已经具备了本地回放.远程回放.设备播放3个模块,其中本地回放用来回放存储在软件本地电脑上的视频文件:远程回放需要通过调用厂家sdk或者GB28181(没实现,后期考虑增加)从NVR回放 ...

  7. 字节二面:你怎么理解信道是golang中的顶级公民

    1. 信道是golang中的顶级公民 goroutine结合信道channel是golang中实现并发编程的标配. 信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程 ...

  8. 微服务实战系列(七)-网关springcloud gateway-copy

    1. 场景描述 springcloud刚推出的时候用的是netflix全家桶,路由用的zuul,但是据说zull1.0在大数据量访问的时候存在较大性能问题,2.0就没集成到springcloud中了, ...

  9. neo4j-图数据库

    neo4j是图数据库 初识neo4j,首先我们要知道neo4j是图数据库.我们平常用的数据库一般是RDBMS(关系型数据库),那么什么是图数据库呢?既然有了关系型数据库,那么为什么要有图数据库呢? 1 ...

  10. 使用树莓派学习Linux驱动 硬件环境评估

    1. 现有设备 surface,树莓派3B 简介 优点 缺点 树莓派+鼠标键盘显示屏 开发方便 需要购买小/静音键盘 需要购买显示屏 显示屏小了用着不舒服,大了太贵 树莓派不需要显示屏!将来还要刷机不 ...