2014-04-25 161 views
-1

我需要一個在多個端口上偵聽的服務器。具有多個端口和多個客戶端的服務器

多個客戶端可以連接到每個端口。連接後,服務器用戶可以選擇每個客戶端並向其發送文本,客戶端將響應此文本。 我使用的線程這份工作,但是當試圖監聽多個端口上時,我得到的是說

錯誤「只有一個使用的每個套接字地址(協議/網絡地址/端口)通常是允許的」。

如何解決此問題,以及在客戶端連接到服務器並向其發送文本後如何訪問線程?

我的源代碼:

private void activeToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    //for each port entered in list box,make a thread 
    if (ListBox1.Items.Count != 0) 
    { 
     activeToolStripMenuItem.Enabled = false; 
     inactiveToolStripMenuItem.Enabled = true; 
     for (i = 0; i < ListBox1.Items.Count; ++i) 
     { 
      serverThread = new Thread(new ThreadStart(StartServer)); 
      serverThread.Start(); 
     } 
    } 
    else 
    { 
     MessageBox.Show("You Should Add at least 1 port, to Listening Ports List.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    } 
} 

private void StartServer() 
{ 
    counter = counter + 1; 
    string Remote_Host_IP; 
    int j = i - 1; 
    port = Convert.ToInt32(ListBox1.Items[counter]); 
    TcpListener listener = new TcpListener(IPAddress.Any, port); 
    listener.Start(); 
    while (true) 
    { 
     mainSocket = listener.AcceptSocket(); 
     // you'll need some more thread stuff down here. 
     if (mainSocket.Connected) 
     { 
      Connected_Num = Connected_Num + 1; 

      Remote_Host_IP = mainSocket.RemoteEndPoint.ToString(); 
      this.Invoke(new MethodInvoker(() => AddConnection(Remote_Host_IP))); 
     } 
    } 
} 

回答

0

不不不不不:)您需要將/在其創建的時間信號的端口號在接受()線程,而不是由一些「反」的方式在所有線程的空間。另外,你不應該讀取非GUI線程中的列表框。

迭代列表並從GUI線程事件處理程序的ListBox中獲取端口號,並將端口號(而不是ListBox索引)作爲創建參數傳遞給接受線程。

首先解決問題,然後再考慮服務器用戶與客戶端進行交互。您將需要某種協議,允許每個客戶/用戶標識自己。

相關問題