Files
2024-06-26 10:30:00 +09:00

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;
}
}
}