📄 srvrsock.cs
字号:
if (localMachineInfo.AddressList.Length > 1 && Helper.IsHostDottedQuad(hostName)){
for (int nLoopCnt = 0; nLoopCnt < localMachineInfo.AddressList.Length; nLoopCnt++){
if (localMachineInfo.AddressList[nLoopCnt].ToString().Equals(hostName)){
nHostAddressIndex = nLoopCnt;
break;
}
}
}
myEndPoint = new IPEndPoint(localMachineInfo.AddressList[nHostAddressIndex], this._srcPort);
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("REDIR-SRVR>> Binding Port: {0} to IP Address {1}", this._srcPort, myEndPoint.Address.ToString())));
this._sockRedir = new Socket(myEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
this._sockRedir.Bind(myEndPoint);
this._sockRedir.Listen((int)SocketOptionName.MaxConnections);
if (SrvrRedirectorSocket._StaticSockRedir != null) SrvrRedirectorSocket._StaticSockRedir.Close();
SrvrRedirectorSocket._StaticSockRedir = this._sockRedir;
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("REDIR-SRVR>> Bound to port {0} of IP Address: {1}", this._srcPort, myEndPoint.Address.ToString())));
_bRedirOk = true;
}catch(SocketException sockEx){
if (sockEx.NativeErrorCode == 10053 || sockEx.NativeErrorCode == 10054){
}else{
if (sockEx.NativeErrorCode == 10061){
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("REDIR-SRVR>> Bound to port {0} of IP Address: {1}", this._srcPort, myEndPoint.Address.ToString())));
}else{
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR>> Socket Exception @ InitServerSocket(...); #[{0}] Message: {1}", sockEx.NativeErrorCode, sockEx.Message)));
}
}
_bRedirOk = false;
}catch(Exception eX){
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Exception @ InitServerSocket(...); Message: {0}", eX.Message)));
_bRedirOk = false;
}
}
#endregion
#region CloseConnection Method
public static void CloseConnection(ConnectionDetails connDets){
try{
connDets.ConnectionEnded = DateTime.Now;
if (_bStatistics){
OnStatisticsEventHandler(new StatisticsEventArgs(string.Format("STA> {0} Bytes Received: {1}; Bytes Sent: {2}", connDets.ToString(), connDets.ConnectionBytesReceived.ToString("#,###,###,###,###"), connDets.ConnectionBytesSent.ToString("#,###,###,###,###"))));
TimeSpan difference = connDets.ConnectionEnded - connDets.ConnectionBegan;
long bytesSentPerSec = ((long)(connDets.ConnectionBytesSent / difference.TotalSeconds));
long bytesRecvdPerSec = ((long)(connDets.ConnectionBytesReceived / difference.TotalSeconds));
decimal kBytesSentPerSec = ((decimal)(bytesSentPerSec / 1024));
decimal kBytesRecvdPerSec = ((decimal)(bytesRecvdPerSec / 1024));
OnStatisticsEventHandler(new StatisticsEventArgs(string.Format("STA> {0} - Connection Uptime: {1} seconds\nSTA> Bytes Received/sec: {2} (KB/sec: {3})\nSTA> Bytes Sent/sec: {4} (KB/sec: {5})", connDets.ToString(), difference.TotalSeconds, bytesRecvdPerSec.ToString("#,###,###,###,###"), kBytesRecvdPerSec.ToString("#,###,###,##0.0000"), bytesSentPerSec.ToString("#,###,###,###,###"), kBytesSentPerSec.ToString("#,###,###,##0.0000"))));
}
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("CON> {0} Closed on {1}.", connDets.ToString(), connDets.ConnectionEnded.ToString("dd/MM/yyyy HH:mm:ss"))));
OnServerMessagesEventHandler(new ServerMessagesEventArgs("=> Goodbye. :)"));
connDets.Dispose();
}catch(SocketException sockEx){
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Socket Exception @ CloseConnection(...); Message: {0}", sockEx.Message)));
}catch(ObjectDisposedException){
}catch(InvalidOperationException){
}catch(Exception){
}
}
#endregion
#region OnServerMessagesEventHandler Method
public static void OnServerMessagesEventHandler(ServerMessagesEventArgs e){
if (ServerMessages != null){
ServerMessages(null, e);
}
}
#endregion
#region OnStatisticsEventHandler Method
public static void OnStatisticsEventHandler(StatisticsEventArgs e){
if (Statistics != null){
Statistics(null, e);
}
}
#endregion
#region OnServerDumpDataEventHandler Method
public static void OnServerDumpDataEventHandler(ServerDumpDataEventArgs e){
if (ServerDumpData != null){
ServerDumpData(null, e);
}
}
#endregion
#region ShutDown Method
public static void ShutDown(){
try{
if (_bRedirOk){
if (SrvrRedirectorSocket._StaticSockRedir != null){
SrvrRedirectorSocket._StaticSockRedir.Close();
OnServerMessagesEventHandler(new ServerMessagesEventArgs("REDIR-SRVR>> Traffic Redirector Shutdown."));
SrvrRedirectorSocket._StaticSockRedir = null;
}
}
}catch(System.Net.Sockets.SocketException sockEx){
OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR>> Socket Exception @ ShutDown(...); #[{0}] Message: {1}", sockEx.NativeErrorCode, sockEx.Message)));
SrvrRedirectorSocket._StaticSockRedir = null;
}catch(System.Exception){
}
}
#endregion
}
#endregion
#region Connection Class
public class Connection{
private Socket _sock;
private int _port = -1;
private string sHostName = string.Empty;
private string sRedirectHost = string.Empty;
private int _redirPort = -1;
private bool _verboseFlag = false;
private bool _doDump = false;
#region Constructors
#region Connection Constructor #1
public Connection(Socket sock, int port, bool verboseFlag, bool doDump){
this._sock = sock;
this._port = port;
this._verboseFlag = verboseFlag;
this._doDump = doDump;
}
#endregion
#region Connection Constructor #2
public Connection(string hostName, int port){
this.sHostName = hostName.ToLower();
this._port = port;
}
#endregion
#endregion
#region TargetConnectionIPAddr Get/Set Accessor
public string TargetConnectionIPAddr{
get{ return this.sRedirectHost; }
set{ this.sRedirectHost = value; }
}
#endregion
#region TargetConnectionPort Get/Set Accessor
public int TargetConnectionPort{
get{ return this._redirPort; }
set{ this._redirPort = value; }
}
#endregion
#region cbHandleIncomingExternalConnection Asynchronous Method
public void cbHandleIncomingExternalConnection(IAsyncResult result){
ConnectionDetails conn = new ConnectionDetails();
try{
Socket s = (Socket)result.AsyncState;
conn.ConnectionSocketExternal = s.EndAccept(result);
conn.ConnectionExternalBuffer = new byte[SrvrRedirectorSocket._StaticBufferSize];
conn.ConnectionInternalBuffer = new byte[SrvrRedirectorSocket._StaticBufferSize];
conn.ConnectionBegan = DateTime.Now;
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("CON> {0} connected on {1}.", conn.ToString(), DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"))));
if (conn.OpenInternalConnection(this.sRedirectHost, this._redirPort)){
conn.ConnectionSocketExternal.BeginReceive(conn.ConnectionExternalBuffer, 0, conn.ConnectionExternalBuffer.Length, SocketFlags.None, new AsyncCallback(this.cbHandleIncomingExternalTraffic), conn);
conn.ConnectionSocketInternal.BeginReceive(conn.ConnectionInternalBuffer, 0, conn.ConnectionInternalBuffer.Length, SocketFlags.None, new AsyncCallback(this.cbHandleIncomingInternalTraffic), conn);
}else{
return;
}
SrvrRedirectorSocket._StaticSockRedir.BeginAccept(new AsyncCallback(this.cbHandleIncomingExternalConnection), result.AsyncState);
}catch(SocketException sockEx){
if (sockEx.NativeErrorCode == 10053 || sockEx.NativeErrorCode == 10054){
SrvrRedirectorSocket.CloseConnection(conn);
}else{
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Socket Exception @ cbHandleIncomingConnection(...); Message: {0}", sockEx.Message)));
}
}catch(System.InvalidOperationException){
SrvrRedirectorSocket.CloseConnection(conn);
}catch(Exception){
SrvrRedirectorSocket.CloseConnection(conn);
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("CON> {0} connected on {1} (UTC).", conn.ToString(), DateTime.Now.ToUniversalTime())));
}
}
#endregion
#region cbHandleIncomingExternalTraffic Asynchronous Method
public void cbHandleIncomingExternalTraffic(IAsyncResult result){
ConnectionDetails connDets = (ConnectionDetails)result.AsyncState;
bool bConnTermd = false;
try{
int bytesRead = -1;
try{
bytesRead = connDets.ConnectionSocketExternal.EndReceive(result);
}catch(ObjectDisposedException){
bConnTermd = true;
}catch(InvalidOperationException){
bConnTermd = true;
}catch(Exception){
bConnTermd = true;
}
if (bConnTermd) return;
if (connDets.ConnectionSocketExternal.Available == 0 && bytesRead == 0){
SrvrRedirectorSocket.CloseConnection(connDets);
return;
}
if (bytesRead != 0){
if (this._verboseFlag) SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("RCV> [srcIPAddr] <{0}---- {1} Bytes ----= [{2}]", '{', bytesRead, connDets.ConnectionSocketExternal.RemoteEndPoint.ToString())));
connDets.ConnectionBytesReceived += bytesRead;
if (this._doDump){
Helper.DumpBytes(connDets.ConnectionExternalBuffer, connDets.ConnectionSocketExternal.RemoteEndPoint.ToString(), bytesRead);
}
connDets.ConnectionSocketInternal.Send(connDets.ConnectionExternalBuffer, 0, bytesRead, SocketFlags.None);
if (this._verboseFlag) SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("SNT> [srcIPAddr] =---- {0} Bytes ----{1}> [dstIPAddr]", bytesRead, '}')));
connDets.ConnectionSocketExternal.BeginReceive(connDets.ConnectionExternalBuffer, 0, connDets.ConnectionExternalBuffer.Length, SocketFlags.None, new AsyncCallback(this.cbHandleIncomingExternalTraffic), connDets);
}
}catch(SocketException sockEx){
if (sockEx.NativeErrorCode == 10053 || sockEx.NativeErrorCode == 10054){
SrvrRedirectorSocket.CloseConnection(connDets);
}else{
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Socket Exception @ cbHandleIncomingExternalTraffic(...); Message: {0}", sockEx.Message)));
}
}catch(ObjectDisposedException){
}catch(Exception eX){
SrvrRedirectorSocket.CloseConnection(connDets);
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Exception @ cbHandleIncomingExternalTraffic(...); Message: {0}", eX.Message)));
}
}
#endregion
#region cbHandleIncomingInternalTraffic Asynchronous Method
public void cbHandleIncomingInternalTraffic(IAsyncResult result){
ConnectionDetails connDets = (ConnectionDetails)result.AsyncState;
bool bConnTermd = false;
try{
int bytesRead = -1;
try{
bytesRead = connDets.ConnectionSocketInternal.EndReceive(result);
}catch(ObjectDisposedException){
bConnTermd = true;
}
if (bConnTermd) return;
if (connDets.ConnectionSocketInternal.Available == 0 && bytesRead == 0){
return;
}
if (bytesRead != 0){
if (this._verboseFlag) SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("RCV> [srcIPAddr] <{0}---- {1} Bytes ----= [dstIPAddr]", '{', bytesRead)));
connDets.ConnectionSocketExternal.Send(connDets.ConnectionInternalBuffer, 0, bytesRead, SocketFlags.None);
if (this._verboseFlag) SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("SNT> [srcIPAddr] =---- {0} Bytes ---{1}> [{2}]", bytesRead, '}', connDets.ConnectionSocketExternal.RemoteEndPoint.ToString())));
if (this._doDump){
Helper.DumpBytes(connDets.ConnectionInternalBuffer, connDets.ConnectionSocketInternal.RemoteEndPoint.ToString(), bytesRead);
}
connDets.ConnectionBytesSent += bytesRead;
connDets.ConnectionSocketInternal.BeginReceive(connDets.ConnectionInternalBuffer, 0, connDets.ConnectionInternalBuffer.Length, SocketFlags.None, new AsyncCallback(this.cbHandleIncomingInternalTraffic), connDets);
}
}catch(SocketException sockEx){
if (sockEx.NativeErrorCode == 10053 || sockEx.NativeErrorCode == 10054){
SrvrRedirectorSocket.CloseConnection(connDets);
}else{
SrvrRedirectorSocket.OnServerMessagesEventHandler(new ServerMessagesEventArgs(string.Format("ERR> Socket Exception @ cbHandleIncomingTrafficServer(...); Message: {0}", sockEx.Message)));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -