泰頂項目管理軟件(全功能開源版) v2025.04
253.3MB / 04-05
DBCHM beta數(shù)據(jù)庫文檔生成工具 v1.9.0.1
29.3MB / 08-16
eCRM(E客CRM)客戶關(guān)系管理系統(tǒng) v1.0.16
9.3MB / 04-13
Util6MIS(優(yōu)六企服系統(tǒng)_附CMS插件及模板) v5.0 源碼版
28.2MB / 03-23
C#實現(xiàn)插件式開發(fā)源碼
0.09MB / 09-26
C#實現(xiàn)報警收集系統(tǒng)源碼
0.91MB / 07-31
C# 文字轉(zhuǎn)語音源碼
0.14MB / 07-28
基于C#語言開發(fā)文件上傳、后綴名稱判別功能
20KB / 07-26
C#圖片去背景示例源碼
113KB / 07-24
C# remoting聊天室源碼
45KB / 07-13
-
obs-studio實時流媒體和屏幕錄制軟件 v31.0.3 C#源碼 / 11.8MB
-
-
eHelp幫助系統(tǒng) v1.1.22 C#源碼 / 9.5MB
-
泰頂項目管理軟件(全功能開源版) v2025.04 C#源碼 / 253.3MB
-
Util6MIS(優(yōu)六企服系統(tǒng)_附CMS插件及模板) v5.0 源碼版 C#源碼 / 28.2MB
-
-
CSerialPort跨平臺串口類庫 v4.3.2 C#源碼 / 1.2MB
-
MiniExcel v1.37.0 C#源碼 / 22.43MB
-
Masuit.Tools v2024.7 C#源碼 / 240KB
-
graphengine圖引擎模塊 v2.4.0 C#源碼 / 2.8MB
詳情介紹
TCP端口轉(zhuǎn)發(fā)工具通過端口轉(zhuǎn)發(fā),協(xié)議透傳,記錄通訊協(xié)議日志
【核心代碼】
#region 私有變量定義 /// <summary> /// 服務(wù)端 /// </summary> private TcpPullServer _serverSocket; /// <summary> /// 客戶端 /// </summary> private TcpPullClient _clientSocket; /// <summary> /// 連接的客戶端IP地址 /// </summary> private string netClientAddress; /// <summary> /// 連接的客戶端端口號 /// </summary> private int netClientPort; /// <summary> /// 網(wǎng)絡(luò)是否連接成功 /// </summary> private bool _isClientNet; /// <summary> /// 連接的客戶端 /// </summary> private List<IntPtr> _clientSockeList; #endregion public MainForm() { InitializeComponent(); _clientSockeList = new List<IntPtr>(); } #region TCP服務(wù)連接 private HandleResult ServerErrors(IntPtr connId, SocketOperation enOperation, int errorCode) { if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode)); _serverSocket?.Disconnect(connId); return HandleResult.Ok; } private HandleResult ServerSocketAccept(IntPtr connId, IntPtr pClient) { _clientSockeList.Add(connId); string clientIp = string.Empty; ushort clientPort = 0; _serverSocket.GetRemoteAddress(connId, ref clientIp, ref clientPort); ShowNetDataMsg("客戶端TCP連接", 0, $"連接地址:{clientIp},端口:{clientPort}"); return HandleResult.Ok; } private HandleResult ServerSocketClose(IntPtr connId) { foreach (var item in _clientSockeList) { if (item == connId) { _clientSockeList.Remove(item); break; } } return HandleResult.Ok; } private HandleResult ServerRecvData(IntPtr connId, int length) { if (length >= 1) { IntPtr bufferPtr = Marshal.AllocHGlobal(length); try { if (_serverSocket.Fetch(connId, bufferPtr, length) == FetchResult.Ok) { var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length); string recvString = ConvertHelper.BytesToHex(recvBytes); var ip = string.Empty; ushort port = 0; _serverSocket.GetRemoteAddress(connId, ref ip, ref port); ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString); if (!_isClientNet) { if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0) { _isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort); } } _clientSocket.GetListenAddress(ref ip, ref port); _clientSocket.Send(recvBytes, length); ShowNetDataMsg($"發(fā)送,IP:{ip},端口:{port}", length, recvString); } } finally { if (bufferPtr != IntPtr.Zero) { Marshal.FreeHGlobal(bufferPtr); } } } return HandleResult.Ok; } private HandleResult ServerSocketShutdown() { _isClientNet = false; return HandleResult.Ok; } #endregion #region TCP/IP客戶端連接 /// <summary> /// 與服務(wù)端成功建立連接時,Socket 監(jiān)聽器將收到該通知 /// </summary> /// <param name="sender">The sender.</param> /// <returns></returns> protected HandleResult OnConnect(TcpClient sender) { _isClientNet = true; string serverIp = string.Empty; ushort serverPort = 0; _clientSocket.GetListenAddress(ref serverIp, ref serverPort); ShowNetDataMsg("服務(wù)端TCP連接", 0, $"連接地址:{serverIp},端口:{serverPort}"); return HandleResult.Ok; } private HandleResult ClientErrors(TcpClient sender, SocketOperation enOperation, int errorCode) { if (errorCode <= 0) throw new ArgumentOutOfRangeException(nameof(errorCode)); sender.Stop(); return HandleResult.Ok; } private HandleResult ClientRecvData(TcpPullClient sender, int length) { if (length >= 5) { IntPtr bufferPtr = Marshal.AllocHGlobal(length); try { if (sender.Fetch(bufferPtr, length) == FetchResult.Ok) { var recvBytes = ConvertHelper.IntptrToBytes(bufferPtr, length); string recvString = ConvertHelper.BytesToHex(recvBytes); var ip = string.Empty; ushort port = 0; sender.GetListenAddress(ref ip, ref port); ShowNetDataMsg($"接收,IP:{ip},端口:{port}", length, recvString); if (_clientSockeList.Count > 0) { foreach (var item in _clientSockeList) { _serverSocket.GetRemoteAddress(item, ref ip, ref port); _serverSocket.Send(item, recvBytes, length); ShowNetDataMsg($"發(fā)送,IP:{ip},端口:{port}", length, recvString); } } } } finally { if (bufferPtr != IntPtr.Zero) { Marshal.FreeHGlobal(bufferPtr); } } } return HandleResult.Ok; } #endregion //將信息顯示到UI線程的方法 private void ShowNetDataMsg(string state, int dataLen, string dataMsg) { NetRecviceMsg.BeginInvoke((MethodInvoker)delegate { var msgList = new StringBuilder(); msgList.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} {state},數(shù)據(jù)長度:{dataLen}\r\n"); msgList.Append($"數(shù)據(jù)內(nèi)容:{dataMsg}\r\n"); NetRecviceMsg.AppendText(msgList.ToString()); if (NetRecviceMsg.Lines.GetUpperBound(0) >= 3000) { LogHelper.WriteLog(NetRecviceMsg.Text); NetRecviceMsg.Clear(); } }); } #region 文本框處理 /// <summary> /// 只允許鍵盤輸入數(shù)字 /// 不包括“-”號 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void IntBackspace_KeyPress(object sender, KeyPressEventArgs e) { string pa = "[0-9]|\b"; //匹配數(shù)字與退格符 Regex r = new Regex(pa); Match m = r.Match(e.KeyChar.ToString()); if (m.Success) e.Handled = false; else { e.Handled = true; } } /// <summary> /// 只允許鍵盤輸入數(shù)字 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void KeyBoardInt_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; if ((e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == (char)8) || (e.KeyChar == '-')) e.Handled = false; } /// <summary> /// 允許鍵盤輸入小數(shù) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <param name="wei">小數(shù)位數(shù)</param> protected void KeyBoardFloat_KeyPress(object sender, KeyPressEventArgs e, int wei) { if (char.IsNumber(e.KeyChar) || e.KeyChar == '.' || e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete) { e.Handled = false; //讓操作生效 int j = 0; int k = 0; bool flag = false; if (((TextBox)sender).Text.Length == 0) { if (e.KeyChar == '.') { e.Handled = true; //讓操作失效 } } int pPos = 0; //小數(shù)點位置 for (int i = 0; i < ((TextBox)sender).Text.Length; i ) { if (((TextBox)sender).Text[i] == '.') { j ; pPos = ((TextBox)sender).Text.IndexOf('.'); //獲取當前小數(shù)點位置 flag = true; } if (flag) { if (char.IsNumber(((TextBox)sender).Text[i]) && (e.KeyChar != (char)Keys.Back || e.KeyChar == (char)Keys.Delete)) { k = ((TextBox)sender).Text.Length - pPos; } } if (j >= 1) { if (e.KeyChar == '.') { e.Handled = true; //讓操作失效 } } if (k > wei) { if (char.IsNumber(((TextBox)sender).Text[i]) && e.KeyChar != (char)Keys.Back) { if (((TextBox)sender).Text.Length - ((TextBox)sender).SelectionStart < wei 1) { if (((TextBox)sender).SelectedText != ((TextBox)sender).Text) { e.Handled = true; ////讓操作失效 } } } } } } else { e.Handled = true; } } /// <summary> /// 判斷文本框輸入的IP地址是否合法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void TextBox_Leave(object sender, EventArgs e) { var regex = new Regex("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"); var blnTest = regex.IsMatch(((TextBox)sender).Text.Trim()); if (blnTest) { string[] strTemp = ((TextBox)sender).Text.Trim().Split('.'); for (int j = 0; j < strTemp.Length; j ) { if (Convert.ToInt32(strTemp[j]) > 255) { //大于255則提示,不符合IP格式 MessageBox.Show(this, @"存在不符合IP地址格式,請重新輸入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question); if (((TextBox)sender).CanFocus) ((TextBox)sender).Focus(); return; } } } else { //輸入非數(shù)字則提示,不符合IP格式 MessageBox.Show(this, @"存在不符合IP地址格式,請重新輸入!", @"提示", MessageBoxButtons.OK, MessageBoxIcon.Question); if (((TextBox)sender).CanFocus) ((TextBox)sender).Focus(); } } /// <summary> /// 光標始終放到最后位置 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void TextBox_OnTextChanged(object sender, EventArgs e) { if (!(sender is TextBox textBox)) return; var str = textBox.Text; var len = Encoding.Default.GetByteCount(str); var maxlen = textBox.MaxLength; var bb = Encoding.Default.GetBytes(str);//得到輸入的字符串的數(shù)組 if (len <= maxlen) return; textBox.Text = Encoding.Default.GetString(bb, 0, maxlen);//將截斷后的字節(jié)數(shù)組轉(zhuǎn)換成字符串 textBox.SelectionStart = maxlen;//將光標放置在輸入文字的最后 } private void ServerPort_KeyPress(object sender, KeyPressEventArgs e) { KeyBoardInt_KeyPress(sender, e); } private void ClientIP_Leave(object sender, EventArgs e) { TextBox_Leave(sender, e); } private void ClearMsg_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(NetRecviceMsg.Text)) LogHelper.WriteLog(NetRecviceMsg.Text); NetRecviceMsg.Clear(); } private void StartBtn_Click(object sender, EventArgs e) { netClientAddress = ClientIP.Text.Trim(); netClientPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ClientPort.Text)); var netServerPort = ConvertHelper.ToInt(ConvertHelper.ReMoveBlank(ServerPort.Text)); if (StartBtn.Text.Equals("啟 動")) { _clientSocket = new TcpPullClient(); _clientSocket.OnConnect = OnConnect; //接收到數(shù)據(jù) _clientSocket.OnReceive = ClientRecvData; //客戶端已連出錯 _clientSocket.OnError = ClientErrors; if (!string.IsNullOrEmpty(netClientAddress) && netClientPort > 0) { _isClientNet = _clientSocket.Connetion(netClientAddress, (ushort)netClientPort); } _serverSocket = new TcpPullServer { IpAddress = "0.0.0.0", Port = (ushort)netServerPort }; //連接出錯 _serverSocket.OnError = ServerErrors; //客戶端連接請求被接受后觸發(fā) _serverSocket.OnAccept = ServerSocketAccept; //連接關(guān)閉后觸發(fā)(服務(wù)端的連接通常是多個,只要某一個連接關(guān)閉了都會觸發(fā)) _serverSocket.OnClose = ServerSocketClose; //接收到數(shù)據(jù) _serverSocket.OnReceive = ServerRecvData; //組件停止后觸發(fā) _serverSocket.OnShutdown = ServerSocketShutdown; _serverSocket.Start(); StartBtn.Text = "停 止"; } else { if (_clientSocket != null) _clientSocket.Stop(); if (_serverSocket != null) _serverSocket.Stop(); StartBtn.Text = "啟 動"; } } #endregion
下載地址
人氣源碼
相關(guān)文章
-
泰頂項目管理軟件(全功能開源版) v2025.04
泰頂項目管理軟件[綜合平臺],始于2010年,具有強大的項目計劃和流程管控功能,上千用戶使用,模塊俱全,架構(gòu)靈活,成熟可靠,適用于多個行業(yè)的專業(yè)的項目管理軟件平臺...
-
DBCHM beta數(shù)據(jù)庫文檔生成工具 v1.9.0.1
DBCHM 是一款簡單、實用的數(shù)據(jù)庫文檔生成工具,該工具從最初支持chm文檔格式開始,通過開源,集思廣益,不斷改進,本文給大家介紹DBCHM beta數(shù)據(jù)庫文檔生成工具 v1.9.0.1 ...
-
eCRM(E客CRM)客戶關(guān)系管理系統(tǒng) v1.0.16
eCRM(E客CRM)是基于eFrameWork低代碼開發(fā)平臺搭建的客戶關(guān)系管理系統(tǒng)。其主要功能包括:系統(tǒng)管理、產(chǎn)品管理、產(chǎn)品分類、客戶管理、訂單管理、客戶回訪、通知公告、銷售計劃...
-
Util6MIS(優(yōu)六企服系統(tǒng)_附CMS插件及模板) v5.0 源碼版
Util6MIS(優(yōu)六企服系統(tǒng))已集成多項插件系統(tǒng),其Util6 CMS、DMS、OAS、WXS 是在信息化管理系統(tǒng)框架(Util6MIS)基礎(chǔ)上開發(fā)的插件系統(tǒng),歡迎需要的朋友下載使用...
-
C#實現(xiàn)插件式開發(fā)源碼
今天給大家分享基于c#開發(fā)的插件式源碼,喜歡的朋友快來下載體驗吧...
-
C#實現(xiàn)報警收集系統(tǒng)源碼
今天給大家分享的是一款基于C#實現(xiàn)報警收集系統(tǒng)源碼,非常不錯,喜歡的朋友快來下載體驗吧...
-
C# 文字轉(zhuǎn)語音源碼
今天給大家分享的實例代碼是C# 文字轉(zhuǎn)語音源碼,喜歡的朋友快來下載體驗吧...
-
基于C#語言開發(fā)文件上傳、后綴名稱判別功能
今天給大家分享基于c#語言開發(fā)的文件上傳、后綴名稱判別功能,喜歡的朋友快來下載使用吧...
-
C#圖片去背景示例源碼
今天給大家分享基于c#實現(xiàn)圖片去背景示例源碼,喜歡的朋友快來下載體驗吧...
-
C# remoting聊天室源碼
使用C#編的聊天工具的程序, 此程序是一款用與REMOTING技術(shù)的程序,非常不錯,喜歡的朋友快來下載體驗吧...
下載聲明
☉ 解壓密碼:www.dbjr.com.cn 就是本站主域名,希望大家看清楚,[ 分享碼的獲取方法 ]可以參考這篇文章
☉ 推薦使用 [ 迅雷 ] 下載,使用 [ WinRAR v5 ] 以上版本解壓本站軟件。
☉ 如果這個軟件總是不能下載的請在評論中留言,我們會盡快修復(fù),謝謝!
☉ 下載本站資源,如果服務(wù)器暫不能下載請過一段時間重試!或者多試試幾個下載地址
☉ 如果遇到什么問題,請評論留言,我們定會解決問題,謝謝大家支持!
☉ 本站提供的一些商業(yè)軟件是供學(xué)習研究之用,如用于商業(yè)用途,請購買正版。
☉ 本站提供的TCP端口轉(zhuǎn)發(fā)工具源碼資源來源互聯(lián)網(wǎng),版權(quán)歸該下載資源的合法擁有者所有。