linux上的TCP代理错误

时间:2014-04-14 00:31:24

标签: c# linux proxy mono

我正在尝试在Linux服务器上运行内部代理,它用C#编码,我正在使用Mono来运行它。 它在Windows 7上运行得非常好但是当我尝试在Linux上运行它时会引发异常;

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
  at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
  at System.Threading.Thread.StartInternal () [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
  at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
  at System.Threading.Thread.StartInternal () [0x00000] in <filename unknown>:0

我没有完全写过这个课程,大部分是来自谷歌,我主要研究它并编辑它但我仍然没有经验丰富的课程和对象。

这是代码;

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace SvrListener
{
    class Server
    {
        static void Main()
        { 
            Server server = new Server();
            server.tcpListener.Start();
        }
        private TcpListener tcpListener;
        private Thread listenThread;

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 32666);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }
        private void ListenForClients()
        {
            try
            {
                Console.WriteLine("Try and listen to:" + tcpListener.Server.LocalEndPoint.ToString());
                this.tcpListener.Start();
                Console.WriteLine("Waiting for connection...");
            }
            catch (SocketException e) { Console.WriteLine("Error:" +e.ErrorCode + " "+ e.Message); }
            while (true)
            {
                //blocks until a client has connected to the server
                TcpClient client = this.tcpListener.AcceptTcpClient();
                //create a thread to handle communication 
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }
        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[1024];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, message.Length);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                string s = message.Length.ToString();
                Console.WriteLine(s);
                Console.WriteLine(encoder.GetString(message, 0, bytesRead));


                Thread forwardThread = new Thread(new ParameterizedThreadStart(forwardPacket));
                forwardThread.Start(message);
            }

            tcpClient.Close();
         }
        private void forwardPacket(object message)
        {
            TcpClient client = new TcpClient();
            byte[] buffer = (byte[])message;
            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.50"), 24585);

            client.Connect(serverEndPoint);

            NetworkStream clientStream = client.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            string shit = encoder.GetString(buffer);
            byte[] nBuffer = encoder.GetBytes(shit);

            clientStream.Write(nBuffer, 0, nBuffer.Length);
            clientStream.Flush();
     }
}
}

更新:所以我尝试了--debug命令,它没有给我任何有用的东西;

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
  at WorldSvrListener.Server.ListenForClients () [0x00000] in <filename unknown>:0
  at System.Threading.Thread.StartInternal () [0x00016] in /usr/src/mono-3.0.7/mcs/class/corlib/System.Threading/Thread.cs:734

2 个答案:

答案 0 :(得分:2)

嗯,你正在调用两次Start(),在Main()和ListenForClients()中,尝试删除Main()中的那个。

我在linux中使用mono来创建一些服务器,我必须告诉我TcpListener有很多麻烦(但至少在四年前......),所以最后还是使用了一个完美无缺的纯套接字实现。

答案 1 :(得分:0)

根据可获得的信息,我的猜测是它在这条线上死亡,因为没有打印其他内容:

Console.WriteLine("Try and listen to:" + tcpListener.Server.LocalEndPoint.ToString());

MSDN上的文档并没有真正说明Socket.LocalEndPoint何时或是否可以返回null,但我认为它可以为未绑定的套接字返回null。也许情况是,在Mono的实现中,套接字不会被绑定,直到TcpListener.Start被调用。

尝试在Start()调用后移动该行,看看它是否使事情不为空。