2012-11-30 299 views
0

我的服務器套接字代碼出現問題 - Main()方法中的循環只執行一次,從不接受任何進一步的輸入。監聽套接字只偵聽一次

class Server 
{ 
    public Socket servSock(int Port) 
    { 
     Socket s1 = null; 
     IPHostEntry ipHE = Dns.GetHostEntry("localhost"); 
     IPAddress ipA = ipHE.AddressList[0]; 
     IPEndPoint ipEp = new IPEndPoint(ipA, Port); 
     s1 = new Socket(ipEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
     s1.Bind(ipEp); 

     return s1; 
    } 

    const int BUFFSIZE = 1024; 
    const int BACKLOG = 255; 

    static void Main(string[] args) 
    {    
     Nwork nwork = new Nwork(); 
     Socket cl = null; 
     Socket s = nwork.servSock(400); 
     s.Listen(BACKLOG); 

     byte[] rcvBuffer = new byte[BUFFSIZE];    

     for (; ;) 
     { 
      string text = ""; 

      Console.Clear(); 
      cl = s.Accept();      
      Console.Write("Handling Client >> " + cl.RemoteEndPoint +"\n\n\n"); 
      cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None); 
      text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0'); 
      Console.Write(text); 
      cl.Close(); 
     } 
    } 
} 
+0

'Nwork.servSock'與'Server.servSock'相同嗎?你確定你只想將服務器套接字綁定到本地主機上嗎? –

回答

0

我不知道「Nwork」是什麼,但我懷疑這是你的bug的來源。只需手動初始化套接字就可以工作,並允許後續連接。

static void Main(string[] args) 
{ 
    Socket s = new Socket(SocketType.Stream, ProtocolType.TCP); 
    Socket cl = null; 
    System.Net.IPEndPoint endpoint = new System.Net.IPEndPoint(0, 400); // listen on all adapters on port 400 
    s.Bind(endpoint); 

    s.Listen(BACKLOG); 

    byte[] rcvBuffer = new byte[BUFFSIZE]; 

    for (; ;) 
    { 
     string text = ""; 

     Console.Clear(); 
     cl = s.Accept(); 
     Console.Write("Handling Client >> " + cl.RemoteEndPoint + "\n\n\n"); 
     cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None); 
     text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0'); 
     Console.Write(text); 
     cl.Close(); 
    } 
} 
+0

嗯問題semms將消失,如果我沒有nwork班,但我仍然無法找出問題。 Thx給所有人 –

0

沒有在你的代碼深潛,我會嘗試在for循環中添加s.Listen(BACKLOG)。
請注意,通過這種方式,您只能同時處理套接字連接,如果另一個人要嘗試打開套接字連接,則您的進程將忙於接收來自先前連接的數據。
這取決於你的情況,但你可能想要實現它的異步。如果你決定這樣做,
This link可能是有用的。

+0

如果我添加s.Listen(BACKLOG),問題仍然存在 –

+0

「Listen」僅將套接字標記爲偵聽套接字,並設置傳入連接隊列的大小,並且只應調用一次。 –