日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UDPRouter

發(fā)布時(shí)間:2025/1/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UDPRouter 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

調(diào)試UDP包交互時(shí),在網(wǎng)上沒有找到一個(gè)好的端口轉(zhuǎn)發(fā)工具。便自己實(shí)現(xiàn)了一個(gè)UDP端口轉(zhuǎn)發(fā)器。

.net 4.0

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace TcpRouter
{
??? class Program
??? {
??????? private int listenPort;
??????? private string ip;
??????? private int port;
??????? private ConcurrentDictionary<IPEndPoint, ProxyItem> proxies = new ConcurrentDictionary<IPEndPoint, ProxyItem>();
??????? private TcpListener listener;
??????? private log4net.ILog log;

??????? public Program(int listenPort, string ip, int port)
??????? {
??????????? // TODO: Complete member initialization
??????????? this.listenPort = listenPort;
??????????? this.ip = ip;
??????????? this.port = port;
??????? }
??????? static void Main(string[] args)
??????? {
??????????? log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile));


??????????? Console.Write("請輸入監(jiān)聽端口:");
??????????? int listenPort = int.Parse(Console.ReadLine());


??????????? Console.Write("請輸入轉(zhuǎn)發(fā)目標(biāo)(IP:PORT):");
??????????? string strDest = Console.ReadLine();

??????????? string ip;
??????????? int port;

??????????? {
??????????????? string[] items = strDest.Split(':');

??????????????? ip = items[0];
??????????????? port = int.Parse(items[1]);
??????????? }

??????????? Console.Title = string.Format("TCP:{0}=>{1}", listenPort, strDest);

??????????? Program p = new Program(listenPort, ip, port);
??????????? p.Run();
??????? }

??????? private void Run()
??????? {
??????????? this.log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
??????????? System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
??????????? IPEndPoint localEP = new IPEndPoint(IPAddress.Any, this.listenPort);
??????????? this.listener = new TcpListener(localEP);
??????????? listener.Start(100);
??????????? listener.BeginAcceptSocket(OnAccepted, listener);

??????????? Console.ReadLine();
??????? }

??????? void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
??????? {
??????????? log.Fatal("UnhandledException", (Exception)e.ExceptionObject);
??????? }
??????? public void OnAccepted(IAsyncResult ar)
??????? {
??????????? TcpListener listener = ar.AsyncState as TcpListener;
??????????? Socket remoteSocket = listener.EndAcceptSocket(ar);
??????????? listener.BeginAcceptSocket(OnAccepted, listener);
??????????? Socket proxy = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
??????????? try
??????????? {
??????????????? proxy.BeginConnect(this.ip, this.port, arConn =>
??????????????? {
??????????????????? try
??????????????????? {
??????????????????????? proxy.EndConnect(arConn);

??????????????????????? this.SetupProxy(new ProxyItem() { Proxy = proxy, RemoteSocket = remoteSocket });

??????????????????? }
??????????????????? catch (Exception exp)
??????????????????? {
??????????????????????? log.Debug(exp.Message);

??????????????????????? //斷開連接
??????????????????????? //remoteSocket.BeginDisconnect(false, ardc => {
??????????????????????? //??? remoteSocket.EndDisconnect(ardc);
??????????????????????? //}, remoteSocket);

??????????????????????? //改為增加日志
??????????????????????? byte[] buffer = new byte[1024];
??????????????????????? remoteSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, arRecv =>
??????????????????????? {
??????????????????????????? try
??????????????????????????? {
??????????????????????????????? int received = remoteSocket.EndReceive(arRecv);

??????????????????????????????? this.Print(remoteSocket.RemoteEndPoint.ToString(), "non", buffer, 0, received);
??????????????????????????? }
??????????????????????????? catch (SocketException ex)
??????????????????????????? {
??????????????????????????????? log.Debug(ex);
??????????????????????????? }
??????????????????????????? catch (ObjectDisposedException ex)
??????????????????????????? {
??????????????????????????????? log.Debug(ex);
??????????????????????????? }


??????????????????????? }, null);
??????????????????? }

?

??????????????? }, proxy);
??????????? }
??????????? catch (Exception exp)
??????????? {
??????????????? log.Debug(exp);
??????????? }

??????? }

??????? private void SetupTransfer(Socket src, Socket des)
??????? {
??????????? string srcAddress = src.RemoteEndPoint.ToString();
??????????? string desAddress = des.RemoteEndPoint.ToString();

??????????? byte[] buffer = new byte[1024];
??????????? Action<IAsyncResult> action = null;
???????????
??????????? action = new Action<IAsyncResult>(ar =>
??????????? {
??????????????? int received = -1;
??????????????? try
??????????????? {
??????????????????? received = src.EndReceive(ar);
??????????????? }
??????????????? catch (Exception exp)
??????????????? {

??????????????????? log.ErrorFormat("src.EndReceive ERROR, srcAddress:{0},{1}", srcAddress, exp.Message);
??????????????????? try
??????????????????? {
??????????????????????? des.Disconnect(false);
??????????????????????? log.Debug("斷開連接" + desAddress);

??????????????????? }
??????????????????? catch{}
??????????????? }
?????????????

??????????????? if(received > 0)
??????????????? {

??????????????????? this.Print(srcAddress, desAddress, buffer, 0, received);
??????????????????? try
??????????????????? {
??????????????????????? des.BeginSend(buffer, 0, received, SocketFlags.None, arSend =>
??????????????????????? {
??????????????????????????? try
??????????????????????????? {
??????????????????????????????? des.EndSend(arSend);
??????????????????????????? }
??????????????????????????? catch (Exception exp)
??????????????????????????? {
??????????????????????????????? log.ErrorFormat("des.EndSend ERROR, desAddress:{0},{1}", desAddress, exp.Message);
??????????????????????????????? log.Error(exp);
??????????????????????????????? try
??????????????????????????????? {
??????????????????????????????????? src.Disconnect(false);
??????????????????????????????????? log.Debug("斷開連接" + srcAddress);
??????????????????????????????? }
??????????????????????????????? catch { }
??????????????????????????????? return;
??????????????????????????? }

??????????????????????????? try
??????????????????????????? {
??????????????????????????????? src.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(action), null);
??????????????????????????? }
??????????????????????????? catch (Exception exp)
??????????????????????????? {
??????????????????????????????? log.ErrorFormat("src.BeginReceive ERROR, srcAddress:{0},{1}", srcAddress, exp.Message);
??????????????????????????????? log.Error(exp);
??????????????????????????????? try
??????????????????????????????? {
??????????????????????????????????? des.Disconnect(false);
??????????????????????????????????? log.Debug("斷開連接" + desAddress);
??????????????????????????????? }
??????????????????????????????? catch { }
??????????????????????????????? try
??????????????????????????????? {
??????????????????????????????????? src.Disconnect(false);
??????????????????????????????????? log.Debug("斷開連接" + srcAddress);
??????????????????????????????? }
??????????????????????????????? catch { }
??????????????????????????? }


??????????????????????? }, des);
??????????????????? }
??????????????????? catch (Exception exp)
??????????????????? {
??????????????????????? log.ErrorFormat("des.BeginSend ERROR, srcAddress:{0},{1}", srcAddress, exp.Message);
??????????????????????? log.Error(exp);
??????????????????????? try
??????????????????????? {
??????????????????????????? des.Disconnect(false);
??????????????????????????? log.Debug("斷開連接" + desAddress);
??????????????????????? }
??????????????????????? catch { }
??????????????????????? try
??????????????????????? {
??????????????????????????? src.Disconnect(false);
??????????????????????????? log.Debug("斷開連接" + srcAddress);
??????????????????????? }
??????????????????????? catch { }
??????????????????? }
??????????????? }
??????????????? else
??????????????? {
??????????????????? log.ErrorFormat("主動(dòng)斷開連接, srcAddress:{0},{1}", srcAddress, "沒有收到數(shù)據(jù)");
??????????????????? //應(yīng)該是斷開了
??????????????????? try
??????????????????? {
??????????????????????? des.Disconnect(false);
??????????????????????? log.Debug("斷開連接" + desAddress);
??????????????????? }
??????????????????? catch { }
??????????????????? try
??????????????????? {
??????????????????????? src.Disconnect(false);
??????????????????????? log.Debug("斷開連接" + srcAddress);
??????????????????? }
??????????????????? catch { }
??????????????? }
???????????????
??????????? });

??????????? try
??????????? {
??????????????? src.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(action), null);
??????????? }
??????????? catch (Exception exp)
??????????? {
??????????????? log.Debug(exp);
??????????????? try
??????????????? {
??????????????????? des.Disconnect(false);
??????????????????? log.Debug("斷開連接" + desAddress);
??????????????? }
??????????????? catch { }
??????????????? try
??????????????? {
??????????????????? src.Disconnect(false);
??????????????????? log.Debug("斷開連接" + srcAddress);
??????????????? }
??????????????? catch { }
??????????? }

??????? }


??????? private void SetupProxy(ProxyItem proxy)
??????? {
??????????? var p = proxy;
??????????? SetupTransfer(proxy.RemoteSocket, proxy.Proxy);
??????????? SetupTransfer(proxy.Proxy, proxy.RemoteSocket);
??????? }


??????? private void Print(string src, string des, byte[] bytes, int offset , int count)
??????? {
??????????? string str = string.Format("{0}=>{1}:{2}", src, des, BitConverter.ToString(bytes, offset, count));
??????????? //Console.WriteLine(str);
??????????? log.Debug(str);
??????? }
??? }


??? public class ProxyItem
??? {

??????? public Socket RemoteSocket { get; set; }

??????? public Socket Proxy { get; set; }

??? }
}

?

總結(jié)

以上是生活随笔為你收集整理的UDPRouter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。