Socket.Accept抛出空引用异常

时间:2017-04-08 16:28:43

标签: c# sockets networking

首先,我是所有Stack Overflow的新手。

我主要是一名Unity程序员,但我需要在我的Pi上运行一些代码,Unity无法为它构建。因此,我正在使用C#,因此我可以稍后使用Mono进行构建。

我有一个基本的套接字服务器代码,它运行统一,它工作正常。 我尝试将其移植到VS但是在调用Socket.Accept时我总是得到Null Ref异常。

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


class RasPi
{
    IPAddress ipAddress;
    IPEndPoint localEndPoint;

    Socket listener;
    Socket handler;

    int i = 0;

    string data = string.Empty;

    public string IP = "192.168.10.5";
    public int Port = 5001;

    static void Main(string[] args)
    {
        new RasPi().Initialize();
        new RasPi().StartListening();
    }


    void Initialize()
    {
        i = 0;

        ipAddress = IPAddress.Parse(IP);
        localEndPoint = new IPEndPoint(ipAddress, Port);


        listener = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream,
                             ProtocolType.Tcp);

        listener.Bind(localEndPoint);
        listener.Listen(10);
    }

    public void StartListening()
    {

        try
        {
            while (true)
            {
                if (i == 0)
                {
                    Console.WriteLine(listener.Accept());
                    handler = listener.Accept();
                }

                data = string.Empty;


                while (true)
                {
                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);

                    data = Encoding.ASCII.GetString(bytes, 0, bytesRec);

                    ProcessData(data);

                    handler.Send(bytes);

                    break;
                }


                //Restart();
                Console.ReadKey();
                break;
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }


   /* void Restart()
    {    
        i++;
        StartListening();
    }*/

    public void ProcessData(string data)
    {
        switch (data)
        {

        }
    }
}

每当我调用listener.Accept();

时都会发生错误

在Unity中,这很好用。有谁愿意帮助我吗?

PS:我是网络新手,所以我可能做了一些愚蠢的事情而且我没有意识到这一点。

1 个答案:

答案 0 :(得分:2)

您创建了2个RasPi个对象,并分别在其上调用Initialize()StartListening()。第二个对象不会与调用Initialize()的第一个对象具有相同的状态,因此StartListening()会失败。相反,创建一个对象并在其上调用两个方法:

var rasPi = new RasPi();
rasPi.Initialize();
rasPi.StartListening();