Commit 31ba36a1 authored by 潘栩锋's avatar 潘栩锋 🚴

obj系统 AD盒添加 绑定本地ip&port, 解决多个AD盒IP地址一样,使用多个网卡连接

parent 6b9fde5f
......@@ -448,7 +448,7 @@ namespace FObjBase
try
{
KeyValuePair<TCPCConn, List<UInt32>> cc_kv;
cc_kv = m_cconns.First(_cc => _cc.Key.RemoteEP.Equals(ep));
cc_kv = m_cconns.First(_cc => _cc.Key.IsSame(ep));
cc_kv.Value.AddRange(objids);
//已经存在此连接,通知
if (cc_kv.Key.IsConnected)
......@@ -475,6 +475,48 @@ namespace FObjBase
return conn;
}
}
/// <summary>
/// 连接到远端的OBJSys连接
/// </summary>
/// <param name="ep">远端地址</param>
/// <param name="localEP>本地地址</param>
/// <param name="objids">连接成功后,通知这些obj</param>
/// <returns></returns>
public TCPCConn Connect_to_Another_OBJSys(IPEndPoint ep, IPEndPoint localEP, params UInt32[] objids)
{
try
{
KeyValuePair<TCPCConn, List<UInt32>> cc_kv;
cc_kv = m_cconns.First(_cc => _cc.Key.IsSame(ep,localEP));
cc_kv.Value.AddRange(objids);
//已经存在此连接,通知
if (cc_kv.Key.IsConnected)
{
foreach (UInt32 objid in objids)
{
IFObj obj = Find(objid);
if (obj != null)
obj.ConnectNotify(cc_kv.Key);
}
}
return cc_kv.Key;
}
catch
{
TCPCConn conn = new TCPCConn(ep)
{
LocalEP = localEP,
ParsePacket = new ParsePacketHandler(ParsePacketInClient),
ConnectAction = new ConnectHandler(CConnConnectAction),
Enable = true
};
m_cconns.Add(conn, new List<uint>(objids));
return conn;
}
}
/// <summary>
/// 断开到远端OBJSys的连接
/// </summary>
......@@ -486,7 +528,7 @@ namespace FObjBase
try
{
KeyValuePair<TCPCConn, List<UInt32>> cc_kv;
cc_kv = m_cconns.First(_cc => _cc.Key.RemoteEP.Equals(ep));
cc_kv = m_cconns.First(_cc => _cc.Key.IsSame(ep));
cc_kv.Value.RemoveAll(objid => objids.Contains(objid));
//删除大通讯的trans
......@@ -519,7 +561,51 @@ namespace FObjBase
}
}
/// <summary>
/// 断开到远端OBJSys的连接
/// </summary>
/// <param name="ep">远端地址</param>
/// <param name="localEP">本地地址</param>
/// <param name="objids">连接成功后,通知这些obj</param>
/// <returns></returns>
public void Disconnect_to_Another_OBJSys(IPEndPoint ep, IPEndPoint localEP, params UInt32[] objids)
{
try
{
KeyValuePair<TCPCConn, List<UInt32>> cc_kv;
cc_kv = m_cconns.First(_cc => _cc.Key.IsSame(ep,localEP));
cc_kv.Value.RemoveAll(objid => objids.Contains(objid));
//删除大通讯的trans
Transactions.RemoveAll(t => objids.Contains(t.SrcObjID));
if (cc_kv.Key.IsConnected)//它的连接是正常的,通知objids,说连接断开了
{
foreach (UInt32 objid in objids)
{
IFObj obj = Find(objid);
if (obj != null)
obj.ConnectNotify(
new TCPCConn(ep)
{
LocalEP = localEP,
Enable = false
});
}
}
if (cc_kv.Value.Count == 0)//已经没有obj需要连接了,删除conn
{
cc_kv.Key.Enable = false;
m_cconns.Remove(cc_kv.Key);
}
}
catch
{
}
}
/// <summary>
/// 注册本地obj 为远端obj的敏感对象,得到远端obj的推送消息
......
......@@ -10,17 +10,43 @@ namespace FObjBase
//客户端长时间不通讯,必须发送 Send_HeartBeat
public class TCPCConn : TCPConn
{
enum STATE
enum STATE
{
Connected,
Not_Connect,
Connecting,
Err_Connect
Err_Connect
}
private STATE state;
private DateTime conn_delay_time;
public IPEndPoint LocalEP { get; set; } = null;
public bool IsSame(IPEndPoint remoteEp)
{
return RemoteEP.Equals(remoteEp);
}
public bool IsSame(IPEndPoint remoteEp, IPEndPoint localEp)
{
if (!RemoteEP.Equals(remoteEp))
return false;
if (LocalEP == null)
{
if (localEp == null)
return true;
else
return false;
}
else
{
if (localEp == null)
return false;
return LocalEP.Equals(localEp);
}
}
private IPEndPoint ep = new IPEndPoint(IPAddress.Any, 20006);
/// <summary>
/// 远端地址
......@@ -58,6 +84,7 @@ namespace FObjBase
{
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Blocking = false;
state = STATE.Not_Connect;
PollModule.Current.Poll_Config(
PollModule.POLL_CONFIG.ADD, onpoll_func, TimeSpan.FromMilliseconds(1));
......@@ -91,6 +118,19 @@ namespace FObjBase
case STATE.Not_Connect:
try
{
if (LocalEP != null)
{
if (sock.LocalEndPoint != null)
{
if (!sock.LocalEndPoint.Equals(LocalEP))
sock.Bind(LocalEP);
}
else
{
sock.Bind(LocalEP);
}
}
sock.Connect(RemoteEP);
}
catch (SocketException e)
......
......@@ -37,6 +37,20 @@ namespace FlyADBase
#endregion
#region IFlyADClient property
/// <summary>
/// 本地网卡地址及端口, 当为null, 由socket动态分配
/// </summary>
public string LocalAddr { get; set; }
IPEndPoint LocalEP
{
get {
if (string.IsNullOrEmpty(LocalAddr))
return null;
else
return Misc.StringConverter.ToIPEndPoint(LocalAddr);
}
}
/// <summary>
/// 连接成功
/// </summary>
......@@ -92,7 +106,7 @@ namespace FlyADBase
/// AD盒地址
/// </summary>
public string Addr { get; set; } = "192.168.251.10:20006";
IPEndPoint LocalEP => Misc.StringConverter.ToIPEndPoint(Addr);
IPEndPoint RemoteEP => Misc.StringConverter.ToIPEndPoint(Addr);
/// <summary>
/// 从flyad7 获取 的systick 转换的时间
......@@ -1302,17 +1316,7 @@ namespace FlyADBase
{
Addr = addr;
if (conn != null)
{
if (!conn.RemoteEP.Equals(LocalEP))
{
//断开之前的连接
CurrObjSys.Disconnect_to_Another_OBJSys(conn.RemoteEP, ID);
}
}
conn = CurrObjSys.Connect_to_Another_OBJSys(LocalEP, ID);
conn.HasCRC = HasCRC;
ReConnect();
}
/// <summary>
......@@ -1322,11 +1326,33 @@ namespace FlyADBase
{
if (conn != null)
{
//断开之前的连接
CurrObjSys.Disconnect_to_Another_OBJSys(conn.RemoteEP, ID);
if (string.IsNullOrEmpty(LocalAddr))
{
if (!conn.IsSame(RemoteEP))
{
//断开之前的连接
CurrObjSys.Disconnect_to_Another_OBJSys(conn.RemoteEP, ID);
}
}
else
{
if (!conn.IsSame(RemoteEP, LocalEP))
{
//断开之前的连接
CurrObjSys.Disconnect_to_Another_OBJSys(conn.RemoteEP, conn.LocalEP, ID);
}
}
}
if (string.IsNullOrEmpty(LocalAddr))
{
conn = CurrObjSys.Connect_to_Another_OBJSys(RemoteEP, ID);
}
else
{
conn = CurrObjSys.Connect_to_Another_OBJSys(RemoteEP, LocalEP, ID);
}
conn = CurrObjSys.Connect_to_Another_OBJSys(LocalEP, ID);
conn.HasCRC = HasCRC;
}
......@@ -1763,6 +1789,7 @@ namespace FlyADBase
if (string.IsNullOrEmpty(jsonDbPath))
return false;
try
{
if (File.Exists(jsonDbPath))
......@@ -1780,6 +1807,7 @@ namespace FlyADBase
return false;
}
public string Addr = "192.168.251.10:20006";
public string LocalAddr = "";
public bool HasCRC = false;
public int GridSmooth = 0;
public int ADLag = 0;
......
......@@ -12,6 +12,11 @@ namespace FlyADBase
/// </summary>
public interface IFlyADClient : IFlyAD
{
/// <summary>
/// 本地网卡地址及端口, 当为null, 由socket动态分配
/// </summary>
string LocalAddr { get; set; }
/// <summary>
/// 连接成功
/// </summary>
......
Subproject commit 4ed21f891f894ac67a2048af145b7ccc9261ed05
Subproject commit 3fd5bff0cbb36bfff39be5a8839295f43894af16
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment