简体   繁体   English

2 个线程处理具有奇怪行为的套接字

[英]2 threads handling sockets with weird behaviour

I just finished my C# proxy containing 2 sockets (one client-socket receiving data from a certain client, one server-socket receiving data from a certain server).我刚刚完成了包含 2 个套接字的 C# 代理(一个客户端套接字从某个客户端接收数据,一个服务器套接字从某个服务器接收数据)。

- Method I) - 方法一)

The fully working receive/send procedure from a previous early-alpha version uses the following memory eating, quick and dirty method I won't implement again:以前的早期 alpha 版本中完全有效的接收/发送过程使用以下内存消耗、快速和肮脏的方法,我不会再次实现:

            while (true)
            {
                if (ClientSocket.Available > 0)
                {
                    // Received data from the game client
                    byte[] buf = new byte[ClientSocket.Available];
                    ClientSocket.Receive(buf);
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the official server
                    ServerSocket.Send(p.Encrypt());
                }

                if (ServerSocket.Available > 0)
                {
                    // Received Data from the official server
                    byte[] buf = new byte[ServerSocket.Available];
                    ServerSocket.Receive(buf);
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the game client
                    ClientSocket.Send(p.Encrypt());
                }
            }

- Method II) - 方法二)

The not working receive/send procedure from the actual version uses the following memory friendly method split into 2 threads:实际版本中不工作的接收/发送过程使用以下内存友好方法拆分为 2 个线程:

class ClientReceiveThread
{
    public Thread T { get; set; }
    public ClientReceiveThread(Socket ClientSocket, Socket ServerSocket)
    {
        T = new Thread(() =>
        {
            try
            {               
                while (ClientSocket.Available > 0)
                {
                    // Received data from the game client
                    byte[] buf = new byte[ClientSocket.Available];
                    ClientSocket.Receive(buf);
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the official server
                    ServerSocket.Send(p.Encrypt());
                }
            }
            catch (Exception e)
            {
                ExceptionHandler.Handle(e);
            }
        });
        T.Start();
    }
}

class ServerReceiveThread
{
    public Thread T { get; set; }
    public ServerReceiveThread(Socket ClientSocket, Socket ServerSocket)
    {
        T = new Thread(() =>
        {
            try
            {
                while (ServerSocket.Available > 0)
                {
                    // Received Data from the official server
                    byte[] buf = new byte[ServerSocket.Available];
                    ServerSocket.Receive(buf);
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the game client
                    ClientSocket.Send(p.Encrypt());
                }
            }
            catch (Exception e)
            {
                ExceptionHandler.Handle(e);
            }
        });
        T.Start();
    }
}

Method I) does insofar work that both Client- and Serversockets receive data, while method II) only receives data from the ClientReceiveThread.方法 I) 在客户端和服务器套接字都接收数据的范围内工作,而方法 II) 只从 ClientReceiveThread 接收数据。 Why does ServerReceiveThread in method II) not receive data?为什么方法II)中的ServerReceiveThread没有接收数据? It's basically the same code as in the while(true) loop, only ported to a seperate thread.它与while(true)循环中的代码基本相同,只是移植到单独的线程中。

Any suggestions or answers are highly appreciated.任何建议或答案都非常感谢。 Thanks in advance!提前致谢!

Fixed it by avoiding the "Available" property:通过避免“可用”属性来修复它:

class ClientReceiveThread
{
    public Thread T { get; set; }
    public ClientReceiveThread(Socket ClientSocket, Socket ServerSocket)
    {
        T = new Thread(() =>
        {
            try
            {               
                byte[] buf = new byte[1024];
                while (ClientSocket.Receive(buf) > 0)
                {
                    // Received data from the game client
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the official server
                    ServerSocket.Send(p.Encrypt());
                }
            }
            catch (Exception e)
            {
                ExceptionHandler.Handle(e);
            }
        });
        T.Start();
    }
}

class ServerReceiveThread
{
    public Thread T { get; set; }
    public ServerReceiveThread(Socket ClientSocket, Socket ServerSocket)
    {
        T = new Thread(() =>
        {
            try
            {
                byte[] buf = new byte[1024];
                while (ServerSocket.Receive(buf) > 0)
                {
                    // Received Data from the official server
                    Packet p = new Packet(buf);
                    Logger.Log(p.ID, LogType.PACKET);
                    // Forward re-encrypted data back to the game client
                    ClientSocket.Send(p.Encrypt());
                }
            }
            catch (Exception e)
            {
                ExceptionHandler.Handle(e);
            }
        });
        T.Start();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM