我正在使用一个tcpclient数组,我已将不同的设备设置为tcp Server,而我的c#Gui将其作为客户端设置为所有设备。我知道网络中每个设备的每个地址ip,这样我就可以毫无问题地设置每个tcp客户端。那么现在我想要GUI可以识别所有的服务器,而不是我手动设置IP地址。我该怎么做? 我首先想到获取pc的本地IP地址,以便我获得基本网络(完成),然后我想要声明一个tcpclient数组,它试图连接到所有可能的IP地址,但需要很多时间。
public void GetLocalIPAddress() // get the local ip of the pc
{
IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
textBox2.Text = ip.ToString();
string aux = ip.ToString();
int num = aux.IndexOf(".");
byte0 = aux.Substring(0,num);
aux = aux.Substring(num + 1);
num = aux.IndexOf(".");
byte1 = aux.Substring(0, num);
aux = aux.Substring(num + 1);
num = aux.IndexOf(".");
byte2 = aux.Substring(0, num);
aux = aux.Substring(num + 1);
// if ip Address = 192.168.1.156 ==> byte0 =192 / byte1=168/ byte2=1
}
private void GetConnectedSensoren()
{
for (int k = 2; k < 254; k++ ) // intialize the tab with all the possible ip Addresses
{
myhostName[k] = byte0 + "." + byte1 + "." + byte2 + "."+k;
try
{
myclient[k] = new TcpClient(myhostName[k], portNum);
}
catch
{
MessageBox.Show("executed here");
}
}
}
答案 0 :(得分:0)
如何创建tcpclient到未知的IP地址?
我认为你做不到。
现在我想要GUI可以识别所有服务器,而不是我手动设置IP地址
另外,我认为不可能。当然你可以生成这个地址 - 如果你想知道每个客户端都在等待你网络中特定端口的连接......你必须尝试连接到它们中的每一个(当然在这个端口上)。
如果您只想检查地址是否处于活动状态(非特定TCP端口),则可以使用ping并解析输出。但是你仍然需要尝试连接到每台计算机。
计算所有可能的IPv4地址的方法仅在网络掩码为255.255.255.0(/ 24)时有效,但如果您有其他掩码,则会失败。有几种方法可以计算子网中的主机。请尝试上述here,here或here之一。希望它有所帮助:)
编辑: 这里:How to get IP of all hosts in LAN?你有一个非常好的解决方案,可以缩短ping响应时间,这样你就可以在一秒钟内测试到255台计算机的连接:)
答案 1 :(得分:0)
正如@badsamaritan所说,无法将数据发送到地址未知的目的地。如果邮件中没有写入您的地址,您也无法收到邮件。
但是你可以使用一些技巧来实现你的目标:
反复试验。这意味着您尝试连接到每个可能的IP地址,这远远超过您的子网。如果您希望能够在每个网络中使用此程序,则必须考虑网络可能使用连接不同子网的路由器。在您自己的家庭局域网中,情况可能更容易。在这两种情况下,它基本上都像IP扫描,耗时且容易出错。
从您的客户端发送UDP广播。数据包含客户端的IP地址。服务器通过UDP使用自己的IP回复客户端。然后,您可以像往常一样建立到服务器的TCP连接。但是,也存在困难:
使用与TCP / IP或UDP / IP完全不同的通信协议。如果该协议没有IP地址,那么您不需要知道它。还有其他协议,但TCP / IP是事实上的标准。不要忘记:您的操作系统需要支持它。