Sic04/FrameworkLocal/RTCore/IoProviders/Mitsubishis/MCSocket.cs

160 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.RT.Log;
namespace MECF.Framework.RT.Core.IoProviders
{
class MCSocket
{
private int m_nPort;
private string m_strAddress;
private Socket m_socket;
private int m_nTimeOut;
public MCSocket()
{
m_nTimeOut = 30000;
//m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
~MCSocket()
{
}
public bool Connected
{
get { return (m_socket != null && m_socket.Connected); }
}
public bool Open(string strAddress, int nPort, string strLocalAddress)
{
if (Connected)
return true;
Close();
m_strAddress = strAddress;
m_nPort = nPort;
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// Bind to specific local endpoint
IPAddress localAddress = IPAddress.Parse(strLocalAddress);
IPEndPoint localEndPoint = new IPEndPoint(localAddress, 0);
m_socket.Bind(localEndPoint);
IPAddress ipAddress = IPAddress.Parse(m_strAddress);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, m_nPort);
//m_socket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
m_socket.SendTimeout = m_nTimeOut;
m_socket.ReceiveTimeout = m_nTimeOut;
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
m_socket.Connect(ipEndPoint);
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
public bool Close()
{
if (m_socket == null) return true;
try
{
m_socket.Shutdown(SocketShutdown.Both);
m_socket.Close();
m_socket = null;
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
public bool Read(byte[] buffer)
{
if (!Connected) return false;
try
{
m_socket.Receive(buffer);
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
public bool Read(byte[] buffer, int length)
{
if (!Connected) return false;
try
{
if (length < 0) return false;
m_socket.Receive(buffer, length, SocketFlags.None);
}
catch (Exception ex)
{
LOG.Write($"Receive data failed, {ex.Message}, from {m_strAddress}:{m_nPort}");
return false;
}
return true;
}
public bool Write(byte[] buffer)
{
if (!Connected) return false;
try
{
m_socket.Send(buffer, SocketFlags.None);
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
public bool Write(byte[] buffer, int length)
{
if (!Connected) return false;
try
{
m_socket.Send(buffer, length, SocketFlags.None);
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
}
}