2017-04-08 46 views
0

首先,我是所有這個堆棧溢出thingy新來的。Socket.Accept拋出空引用異常

我大多是Unity程序員,但我需要在我的Pi上運行一些代碼,並且Unity不能爲它構建。因此,我使用C#,以便稍後可以使用Mono進行構建。

我有一個基本的套接字服務器代碼運行統一,它工作正常。 我嘗試將它移植到VS,但在調用Socket.Accept時我總是得到一個空引用異常。

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:我是新來的網絡,所以我可能做一些愚蠢的事情,我沒有意識到它。

+0

那是因爲你調用'Initialize'不在同一'RasPi'情況下,你以後叫'StartListening'。更改爲'var rp = new RasPi(); rp.Initialize(); rp.StartListening();' – Evk

回答

2

您可以創建2個RasPi對象並分別單獨呼叫Initialize()StartListening()。第二個對象與第一個調用Initialize()的對象的狀態不同,因此StartListening()失敗。相反,創建一個對象,並調用它的兩種方法:

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

你是對的!愚蠢的我補充說,因爲它抱怨我需要一個參考訪問這些方法。 – NoobStudios