384 lines
9.0 KiB
C#
384 lines
9.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using SystemX.Common;
|
|
using SystemX.Common.Serialization;
|
|
|
|
namespace SystemX.Net.Comm
|
|
{
|
|
//
|
|
// 요약:
|
|
// Socket error information
|
|
public class CommonSocketException : Exception
|
|
{
|
|
public CommonSocketException()
|
|
{
|
|
}
|
|
|
|
public CommonSocketException(string message)
|
|
: base(message)
|
|
{
|
|
}
|
|
|
|
public CommonSocketException(string message, Exception inner)
|
|
: base(message, inner)
|
|
{
|
|
}
|
|
}
|
|
|
|
public enum SOCKET_RULE
|
|
{
|
|
NONE = -1,
|
|
SERVER = 0,
|
|
CLIENT = 1
|
|
}
|
|
|
|
public enum SOCKET_TYPE
|
|
{
|
|
NONE = -1,
|
|
TCP = 0,
|
|
UDP = 1
|
|
}
|
|
|
|
public class SystemXSocket : IDisposable
|
|
{
|
|
public virtual event SocketCallEvent Comm_Connect_Event;
|
|
public virtual event SocketCallEvent Socket_Error_Event;
|
|
|
|
public virtual event SendRecvCallEvent Comm_Send_Event;
|
|
public virtual event SendRecvCallEvent Comm_Recv_Event;
|
|
|
|
public virtual event EventHandler<ScheduleEvent> AwaitSendEvent;
|
|
public virtual event EventHandler<ScheduleEvent> AwaitRecvEvent;
|
|
|
|
public int nSocketNumber;
|
|
|
|
private bool bDisposed;
|
|
|
|
public SOCKET_RULE SOCK_RULE { set; get; }
|
|
|
|
public SOCKET_TYPE SOCK_TYPE { set; get; }
|
|
|
|
|
|
public SystemXSocket(SOCKET_RULE GET_SOCK_RULE, SOCKET_TYPE GET_SOCK_TYPE) {
|
|
SOCK_RULE = GET_SOCK_RULE;
|
|
|
|
SOCK_TYPE = GET_SOCK_TYPE;
|
|
|
|
bDisposed = false;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
protected virtual void Dispose(bool bDisposing)
|
|
{
|
|
if(bDisposed == false)
|
|
{
|
|
if(bDisposing)
|
|
{
|
|
//Manage
|
|
}
|
|
|
|
//Unmanage
|
|
|
|
bDisposed = true;
|
|
}
|
|
}
|
|
|
|
~SystemXSocket()
|
|
{
|
|
Dispose(false);
|
|
}
|
|
|
|
public virtual bool BeginSend(byte[] ucDatas) { return true; }
|
|
public virtual bool BeginSend(Socket SetSock, byte[] ucDatas) { return true; }
|
|
public virtual bool BeginSend(string strMessage) { return true; }
|
|
|
|
public virtual void SetRefSocketPacketClear() { return; }
|
|
}
|
|
|
|
public class CPacketDataInfo
|
|
{
|
|
public Guid ID;
|
|
public DateTime dtPacket;
|
|
public byte[] ucData;
|
|
public int nDataSize;
|
|
|
|
public CPacketDataInfo(DateTime dateTime, byte[] ucGetData, int nGetSize)
|
|
{
|
|
if (ID == default(Guid))
|
|
ID = Guid.NewGuid();
|
|
|
|
dtPacket = dateTime;
|
|
|
|
nDataSize = nGetSize;
|
|
|
|
ucData = new byte[nGetSize];
|
|
|
|
Buffer.BlockCopy(ucGetData, 0, ucData, 0, nGetSize);
|
|
}
|
|
public CPacketDataInfo(Guid SetID, DateTime dateTime, byte[] ucGetData, int nGetSize)
|
|
{
|
|
ID = SetID;
|
|
|
|
dtPacket = dateTime;
|
|
|
|
nDataSize = nGetSize;
|
|
|
|
ucData = new byte[nGetSize];
|
|
|
|
Buffer.BlockCopy(ucGetData, 0, ucData, 0, nGetSize);
|
|
}
|
|
}
|
|
|
|
public class AsyncSocketObject
|
|
{
|
|
public byte[] recvBuffer;
|
|
public Socket WorkSocket;
|
|
public readonly int iBufferSize;
|
|
|
|
public AsyncSocketObject(int ibufferSize)
|
|
{
|
|
iBufferSize = ibufferSize;
|
|
|
|
recvBuffer = new byte[iBufferSize];
|
|
}
|
|
|
|
public void ClearBuffer()
|
|
{
|
|
Array.Clear(recvBuffer, 0, iBufferSize);
|
|
}
|
|
}
|
|
|
|
public class TcpKeepAlive
|
|
{
|
|
public uint OnOff { get; set; }
|
|
public uint KeepAliveTime { get; set; }
|
|
public uint KeepAliveInterval { get; set; }
|
|
|
|
public byte[] GetBytes()
|
|
{
|
|
return BitConverter.GetBytes(OnOff).Concat(BitConverter.GetBytes(KeepAliveTime)).Concat(BitConverter.GetBytes(KeepAliveInterval)).ToArray();
|
|
}
|
|
}
|
|
|
|
public static class ConnectTokken
|
|
{
|
|
public enum Connect_Token
|
|
{
|
|
T010 = 0,
|
|
T020 = 1,
|
|
T030 = 2,
|
|
T040 = 3,
|
|
T050 = 4,
|
|
T060 = 5,
|
|
T070 = 6,
|
|
T080 = 7,
|
|
T090 = 8,
|
|
T100 = 9,
|
|
T110 = 10,
|
|
T120 = 11,
|
|
T130 = 12,
|
|
T140 = 13,
|
|
T150 = 14,
|
|
T160 = 15,
|
|
T170 = 16,
|
|
T180 = 17,
|
|
T190 = 18,
|
|
T200 = 19,
|
|
T210 = 20,
|
|
T220 = 21,
|
|
T230 = 22,
|
|
T240 = 23,
|
|
T250 = 24,
|
|
T260 = 25,
|
|
T270 = 26,
|
|
T280 = 27,
|
|
T290 = 28,
|
|
T300 = 29,
|
|
T310 = 30,
|
|
T320 = 31,
|
|
T330 = 32,
|
|
T340 = 33,
|
|
T350 = 34,
|
|
T360 = 35,
|
|
T370 = 36,
|
|
T380 = 37,
|
|
T390 = 38,
|
|
T400 = 39,
|
|
T410 = 40,
|
|
T420 = 41,
|
|
T430 = 42,
|
|
T440 = 43,
|
|
T450 = 44,
|
|
T460 = 45,
|
|
T470 = 46,
|
|
T480 = 47,
|
|
T490 = 48,
|
|
T500 = 49,
|
|
T510 = 50,
|
|
T520 = 51,
|
|
T530 = 52,
|
|
T540 = 53,
|
|
T550 = 54,
|
|
T560 = 55,
|
|
T570 = 56,
|
|
T580 = 57,
|
|
T590 = 58,
|
|
T600 = 59,
|
|
T610 = 60,
|
|
T620 = 61,
|
|
T630 = 62,
|
|
T640 = 63,
|
|
T650 = 64,
|
|
T660 = 65,
|
|
T670 = 66,
|
|
T680 = 67,
|
|
T690 = 68,
|
|
T700 = 69,
|
|
T710 = 70,
|
|
T720 = 71,
|
|
T730 = 72,
|
|
T740 = 73,
|
|
T750 = 74,
|
|
T760 = 75,
|
|
T770 = 76,
|
|
T780 = 77,
|
|
T790 = 78,
|
|
T800 = 79,
|
|
T810 = 80,
|
|
T820 = 81,
|
|
T830 = 82,
|
|
T840 = 83,
|
|
T850 = 84,
|
|
T860 = 85,
|
|
T870 = 86,
|
|
T880 = 87,
|
|
T890 = 88,
|
|
T900 = 89,
|
|
T910 = 90,
|
|
T920 = 91,
|
|
T930 = 92,
|
|
T940 = 93,
|
|
T950 = 94,
|
|
T960 = 95,
|
|
T970 = 96,
|
|
T980 = 97,
|
|
T990 = 98,
|
|
T1000 = 99,
|
|
T1010 = 100,
|
|
T1020 = 101,
|
|
T1030 = 102,
|
|
T1040 = 103,
|
|
T1050 = 104,
|
|
T1060 = 105,
|
|
T1070 = 106,
|
|
T1080 = 107,
|
|
T1090 = 108,
|
|
T1100 = 109,
|
|
T1110 = 110,
|
|
T1120 = 111,
|
|
T1130 = 112,
|
|
T1140 = 113,
|
|
T1150 = 114,
|
|
T1160 = 115,
|
|
T1170 = 116,
|
|
T1180 = 117,
|
|
T1190 = 118,
|
|
T1200 = 119,
|
|
T1210 = 120,
|
|
T1220 = 121,
|
|
T1230 = 122,
|
|
T1240 = 123,
|
|
T1250 = 124,
|
|
T1260 = 125,
|
|
T1270 = 126,
|
|
T1280 = 127
|
|
}
|
|
|
|
public const int MAX_PROCESS_NUM = 128;
|
|
|
|
public const int MAX_TOKEN_NUM = 128;
|
|
|
|
public static bool[,] m_bTokenUseState = new bool[MAX_PROCESS_NUM, MAX_TOKEN_NUM];
|
|
|
|
private static object objWait = new object();
|
|
|
|
public static int GET_MAX_PROCESS
|
|
{
|
|
get { return MAX_PROCESS_NUM; }
|
|
}
|
|
|
|
public static void AllClearToken(Connect_Token thisToken)
|
|
{
|
|
lock (objWait)
|
|
{
|
|
for (int i = 0; i < MAX_TOKEN_NUM; i++)
|
|
m_bTokenUseState[(int)thisToken, i] = false;
|
|
}
|
|
}
|
|
|
|
public static bool GetTokenPosState(Connect_Token thisToken, int iPos)
|
|
{
|
|
bool bValue = false;
|
|
|
|
if (iPos >= 0 && iPos < MAX_TOKEN_NUM)
|
|
bValue = m_bTokenUseState[(int)thisToken, iPos];
|
|
|
|
return bValue;
|
|
}
|
|
|
|
public static void SetTokenState(Connect_Token thisToken, bool bValue)
|
|
{
|
|
lock (objWait)
|
|
{
|
|
for (int i = 0; i < MAX_TOKEN_NUM; i++)
|
|
{
|
|
if (m_bTokenUseState[(int)thisToken, i] == !bValue)
|
|
{
|
|
m_bTokenUseState[(int)thisToken, i] = bValue;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//사용 불가능 true 가능 false
|
|
public static bool GetTokenState(Connect_Token thisToken)
|
|
{
|
|
bool bUnused = true;
|
|
|
|
for (int i = 0; i < MAX_TOKEN_NUM; i++)
|
|
{
|
|
if (m_bTokenUseState[(int)thisToken, i] == false)
|
|
{
|
|
//사용 가능
|
|
bUnused = false;
|
|
|
|
return bUnused;
|
|
}
|
|
|
|
}
|
|
|
|
//사용 불가능
|
|
bUnused = true;
|
|
|
|
return bUnused;
|
|
}
|
|
}
|
|
}
|