2014-04-25 4 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

Nononono 모든 스레드의 공간. 또한 GUI가 아닌 스레드에서 목록 상자를 읽지 않아야합니다.

목록을 반복하고 GUI 스레드 이벤트 처리기의 ListBox에서 포트 번호를 가져 와서 ListBox 인덱스가 아닌 포트 번호를 승인 스레드의 생성 매개 변수로 전달하십시오.

먼저 수정하고 클라이언트와 상호 작용하는 서버 사용자에 대해 생각해보십시오. 각 클라이언트/사용자가 자신을 식별 할 수있게하는 일종의 프로토콜이 필요합니다.

관련 문제