2017-01-30 64 views
0

情景:C#,TcpClient的多个IP地址,但在同一端口上

我有多个机器,每个机智命中自己的IP,运行一个TCPSERVER,所有在同一端口上。在每个事务中,如果打开了tcpServer端口,则会发送数据。它在开放港口之前寻找客户。

我需要什么:

我正在写一个应用程序,需要:通过IP的名单,如果他们是菱 1.检查 2.打开一个TcpClient的端口,每台机器的IP,(全在相同的端口上) 3.每隔指定的时间后,确保连接处于打开状态,如果没有重新打开连接。

未来:

我使用XML文件,得到用于获取计算机列表和端口上侦听的SQL数据。在这个xml中也是一个udp设置,如果是,那么发送的数据必须被接收并重定向到指定的UDP端口。

的类别:

public static void tcpListen(IPAddress server, int port) 
     { 
      try 
      { 
       TcpListener listener = new TcpListener(server, port); 
       listener.AcceptTcpClient(); 
       listener.Start(); 

       while (true) 
       { 
        Socket client = listener.AcceptSocket(); 

        var childSocketThread = new Thread(() => 
        { 
         byte[] data = new byte[100]; 
         int size = client.Receive(data); 
         for (int i = 0; i < size; i++) 
         feedback = server + ":" + port + ": " + Convert.ToChar(data[i]); 

         using (StreamWriter w = File.AppendText("TCPLog.log")) 
         { 
          Log(feedback, w); 
         } 
         client.Close(); 
        }); 
        childSocketThread.Start(); 
       } 
      } 
      catch (Exception err) 
      { 
       using (StreamWriter w = File.AppendText("error.log")) 
       { 
        Log("tcpControl.tcpListen: " + err.Message, w); 
       } 
      } 
     } 

代码,每几秒钟重复部分:

private void ptoCheck() 
     { 
      IPAddress sourceIP; 
      int sourcePort; 
      int destinationPort; 
      string tcpStatus; 
      int oldCOunt = dgvWorkstations.RowCount; 
      int newCount = sqlScripts.posCount(sqlServer, sqlUser, sqlPassword, sqlDatabase); 

      if (newCount != oldCOunt) 
      { 
       getWorkstations(); 
      } 

      try 
      { 
       foreach (DataGridViewRow row in dgvWorkstations.Rows) 
       { 
        int i = row.Index; 
        bool tcpState; 
        dgvWorkstations["Status", i].Value = "Checking"; 
        dgvWorkstations.Refresh(); 
        name = row.Cells["POS_Name"].Value.ToString(); 
        sourceIP = IPAddress.Parse(row.Cells["LastKnownIP"].Value.ToString()); 
        sourcePort = Convert.ToInt32(row.Cells["Receive_Port"].Value.ToString()); 
        destinationPort = Convert.ToInt32(row.Cells["Send_Port"].Value.ToString()); 
        tcpState = tcpControl.tcpCheck(sourceIP, sourcePort, name); 

        if (tcpState == false) 
        { 
         dgvWorkstations["Status", i].Value = "Connecting";       
         dgvWorkstations.Refresh(); 
         tcpStatus = tcpControl.tcpConnect(sourceIP, sourcePort, name); 
         tcpControl.tcpListen(sourceIP, sourcePort); 
         dgvWorkstations["Status", i].Value = tcpStatus; 
        } 

        if (tcpState == true) 
        { 
         dgvWorkstations["Status", i].Value = "Connected"; 
         dgvWorkstations.Refresh(); 
        } 
        i = i + 1; 
       } 
      } 
      catch (Exception err) 
      { 
       using (StreamWriter w = File.AppendText("AError.log")) 
       { 
        Log("frmMain.ptoCheck: (" + name + ") " + err.Message, w); 
       } 
      }//End Catch 
     } 
+0

尝试使用线程或backgroundworkers。我们可以看到你使用的代码吗? – Sergio

+0

可以只有一个IP连接具有相同的3个参数:1)源IP地址,2)目标IP地址3)端口号。当客户端和服务器在同一台PC上时,客户端连接到计算机的IP地址,服务器端会侦听到IPAny,因此不会有任何冲突。当在单台PC上模拟网络时,您需要多个网卡,以便您拥有更多而不是一个IP地址,否则,您需要使用不同的端口号。 – jdweng

+0

我试图添加我用于连接的代码,但它一直显示错误,并说太多字符。 – shinga77

回答

0

我得到了下面的代码头工作,从我的课,我可以现在做多个连接,然而。我调用另一个方法来侦听和接收数据的部分阻止了第一种方法,并保持它直到连接断开而不进行进一步的连接。

我的班级:

public void tcpTest2(IPAddress server, Int32 port, int x) 
     { 
      TcpClient client; 

      sendData("Connecting to Host: " + server + " on port: " + port.ToString() + "..."); 
      sendStatus("Connecting", x); 

      try 
      { 
       client = new TcpClient(server.ToString(), port); 

       if (false) 
       { 

       }    

       if (true) 
       { 
        sendData("Connection to Host: " + server + " on port: " + port.ToString() + "..ESTABLISHED"); 
        sendStatus("Connected", x);   
        receiveData(client, server, port); 
       } 

      } 
      catch (Exception) 
      { 
       sendData("Connection to Host: " + server + " on port: " + port.ToString() + "..FAILED"); 
       sendStatus("Failed", x); 
      } 
     } 

     public void receiveData(TcpClient client, IPAddress server, int port) 
     { 
      Byte[] data = System.Text.Encoding.Default.GetBytes("|"); 
      data = new byte[1024]; 
      string stringData; 
      bool connected; 
      connected = true; 

      while (connected == true) 
      { 
       string fromC = client.Client.RemoteEndPoint.ToString(); 
       NetworkStream ns = client.GetStream(); 
       int recv = ns.Read(data, 0, data.Length); 
       stringData = Encoding.ASCII.GetString(data, 0, recv); 
       sendUpdate("{" + fromC + "}" + stringData); 
       connected = IsConnected(client); 
      } 

      if (connected == false) 
      { 
       sendData("Connection to Host: " + server + " on port: " + port.ToString() + "..LOST"); 
       sendLost(server); 
      } 
     } 

     public bool IsConnected(TcpClient client) 
     { 
      try 
      { 
       if (client != null && client.Client != null && client.Client.Connected) 
       { 
        if (client.Client.Poll(0, SelectMode.SelectRead)) 
        { 
         byte[] buff = new byte[1]; 
         if (client.Client.Receive(buff, SocketFlags.Peek) == 0) 
         { 
          return false; 
         } 
         else 
         { 
          return true; 
         } 
        } 

        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
      catch 
      { 
       return false; 
      } 
     } 
    }  
0

这里是为我工作的最终代码:

我的班级:

public void tcpConnect(object pos) 
     { 
      IPAddress hostIP = IPAddress.Parse(pos.ToString().Split(':')[0]); 
      int hostPort = Int32.Parse(pos.ToString().Split(':')[1]); 
      rowInd = Int32.Parse(pos.ToString().Split(':')[2]); 

      var client = new TcpClient();    

      if (!client.ConnectAsync(hostIP, hostPort).Wait(1000)) 
      { 
       sendData("Connection to Host: " + hostIP + " on port: " + hostPort.ToString() + ".FAILED"); 
       sendStatus("Failed", "", rowInd); 
       return; 
      } 

      if (true) 
      { 
       sendData("Connection to Host: " + hostIP.ToString() + " on port: " + hostPort.ToString() + "..ESTABLISHED"); 
       Thread thread = new Thread(new ParameterizedThreadStart(ClientHandler)); 
       thread.IsBackground = true; 
       Thread.FreeNamedDataSlot(hostIP.ToString() + rowInd.ToString()); 
       thread.Name = hostIP.ToString() + rowInd.ToString(); 
       thread.Start(client); 
       threadID = thread.ManagedThreadId.ToString(); 
       sendStatus("Connected", threadID, rowInd); 
      } 
     } 

     public bool IsConnected(TcpClient client) 
     { 
      try 
      { 
       if (client != null && client.Client != null && client.Client.Connected) 
       { 
        if (client.Client.Poll(0, SelectMode.SelectRead)) 
        { 
         byte[] buff = new byte[1]; 
         if (client.Client.Receive(buff, SocketFlags.Peek) == 0) 
         { 
          return false; 
         } 
         else 
         { 
          return true; 
         } 
        } 

        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
      catch 
      { 
       return false; 
      } 
     } 

     public void ClientHandler(object c) 
     {    
      TcpClient client = (TcpClient)c;    
      NetworkStream netstream = client.GetStream(); 
      string fromC = client.Client.RemoteEndPoint.ToString(); 
      string fromIP = fromC.Split(':')[0]; 

      bool connected = true; 
      while (connected) 
      { 
       Thread.Sleep(10); 
       try 
       { 
        byte[] data = new byte[client.ReceiveBufferSize]; 
        data = System.Text.Encoding.Default.GetBytes("|"); 
        data = new byte[1024]; 
        string stringData;     
        NetworkStream ns = client.GetStream(); 
        int recv = ns.Read(data, 0, data.Length); 
        stringData = Encoding.ASCII.GetString(data, 0, recv); 
        sendUpdate("|" + fromC + "|" + stringData); 
        connected = IsConnected(client); 
       } 
       catch (Exception err) 
       { 
        connected = false; 
        sendLost(fromIP); 

        using (StreamWriter w = File.AppendText("Arch-PTO.log")) 
        { 
         Log("tcpServices.ClientHandler: " + err.Message, w); 
        } 
       } 
      }    
      sendLost(fromIP); 
     }