C# socket 请求转发

服务端:

复制代码
void Main()
{
    Socket socketA = null;
    Socket socketB = null;
    var maxWaitingRequest = 10;
    var localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    localSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
    localSocket.Bind(new IPEndPoint(IPAddress.Any, 81));
    localSocket.Listen(maxWaitingRequest);
    while (true)
    {
        var remoteSocket = localSocket.Accept();
        if (socketA == null)    //client
            socketA = remoteSocket;
        else if (socketB == null)   //server
        {
            socketB = remoteSocket;
            ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), new Socket[] { socketA, socketB });
            ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), new Socket[] { socketB, socketA });
        }
    }
}

public static void transfer(object obj)
{
    var socketA = ((Socket[])obj)[0];
    var socketB = ((Socket[])obj)[1];
    while (true)
    {
        try
        {
            var data = new byte[10240];
            int read = socketA.Receive(data);
            if(read > 0)
                socketB.Send(data.Take(read).ToArray());
        }
        catch
        {
            socketA.Close();
            socketA.Close();
            break;
        }
    }
}
复制代码

客户端:

复制代码
static Queue<string> msgList = new Queue<string>();
static readonly object msgLocker = new Object();
static int localPort = 20000;
static string msg = "I am A";

void Main()
{
    var localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var localEP = new IPEndPoint(IPAddress.Any, localPort);
    localSocket.Bind(localEP);
    localSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
    ThreadPool.QueueUserWorkItem(recieveHandler, localSocket);
    
    Thread.Sleep(10000);
    localSocket.Send(System.Text.Encoding.Default.GetBytes(msg));
    
    while (true)
    {
        lock (msgLocker)
        {
            if(msgList.Count >0)
                Console.WriteLine(msgList.Dequeue());
        }
        
        Thread.Sleep(1000);
    }
}

public static void recieveHandler(object p)
{
    var localSocket = (Socket)p;
    while (true)
    {
        var data = new byte[1024];
        var read = localSocket.Receive(data);
        if (read > 0)
        {
            Console.WriteLine("recieved " + read.ToString() + " bytes");
            lock (msgLocker)
                msgList.Enqueue(System.Text.Encoding.Default.GetString(data.Take(read).ToArray()));
        }
    }
}
// Define other methods and classes here
复制代码

先启动服务端,在10秒内,启动两个客启端,两个客户端就能收到来自对方的 msg

posted on   空明流光  阅读(845)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-12-13 WPF中获取控件默认样式和模板XML
2013-12-13 vb6通send和recv请求网络资源

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示