160 lines
3.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|