c#套接字:如何获得服务器的IP地址,而无需在客户端输入或固定IPAddress
本文关键字:客户端 输入 IPAddress 套接字 何获得 服务器 地址 IP | 更新日期: 2023-09-27 18:09:04
在下面的代码中,服务器在端口1214侦听。如果客户端连接到服务器,服务器广播确认消息"Hi"。
问题是
- 我不想在客户端修改或输入IP地址
- 如何扫描同一本地网络中端口"1214"侦听的所有服务器的IPAddress ?并过滤(显示在列表框中)回复"Hi"的IP地址消息只?
Please Help me
服务器代码 -监听1214端口的所有传入连接,连接后回复"HI"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace PortScanServer
{
class Program
{
static void Main(string[] args)
{
string IP_Adress = "";
IPHostEntry localComputer = Dns.Resolve("KAUNGSAN-PC");
IPAddress[] localIP = localComputer.AddressList;
for (int i = 0; i < localIP.Length; i++) {
IP_Adress = IP_Adress + localIP[i];
}
while (true) {
try {
IPAddress ipAd = IPAddress.Parse(IP_Adress);
TcpListener listener1 = new TcpListener(ipAd, 1214);
listener1.Start();
Console.WriteLine("Server is running on portt 1214...");
Socket s = listener1.AcceptSocket();
Console.WriteLine("Connection accepted from this IP: " + s.RemoteEndPoint);
byte[] b = new byte[100];
int k = s.Receive(b);
Console.WriteLine("Recieved a bunch of byytes:");
for (int i = 0; i < k; i++) {
Console.Write(Convert.ToChar(b[i]));
}
ASCIIEncoding asen = new ASCIIEncoding();
// Only send these bytes if you want the scanner to identify that
// you are not Kazaa
s.Send(asen.GetBytes("Hi"));
Console.WriteLine("'nI sent the client aknowledgement");
s.Close();
listener1.Stop();
}
catch (Exception e) {
Console.WriteLine("Ah, poo, an error: " + e);
}
}
}
}
}
Client -要求用户输入IP地址。如果IP地址为1214端口侦听的套接字,则收到确认消息"HI"。
using System.IO;
using System.Net.Sockets;
using System.Text;
namespace TestPortScan
{
class Program
{
static void Main(string[] args)
{
bool sucess;
String response = "";
try
{
TcpClient myTCPclient = new TcpClient();
Console.Write("Enter IP of Target: ");
String IP_Adress = Console.ReadLine(); Console.WriteLine("");
myTCPclient.Connect(IP_Adress, 1214);
Stream outputStream1 = myTCPclient.GetStream();
ASCIIEncoding transEncoded = new ASCIIEncoding();
byte[] byte1 = transEncoded.GetBytes("Are You Kazaa?");
outputStream1.Write(byte1, 0, byte1.Length);
byte[] byte2 = new byte[100];
int k = outputStream1.Read(byte2, 0, 100);
for (int j = 0; j < k; j++)
{
response = response + Convert.ToChar(byte2[j]);
}
myTCPclient.Close();
if (response == "Hi")
{
sucess = true;
}
else
{
sucess = false;
}
}
catch
{
sucess = false;
}
if (sucess)
{
Console.WriteLine("'nThe Target Reply Hi");
}
else
{
Console.WriteLine("'nThe Target does not respond");
}
String waitForKey = Console.ReadLine();
}
}
Thanks in advance
我敢说,要找出一个特定的IP地址是否正在监听一个特定的套接字,唯一的方法是尝试打开与它的连接。在网络中遍历每个可能的IP地址可能……耗时。
你可能想看看ZeroConf,它提供了一种通过DNS发现服务的机制。OS X内置了对ZeroConf和服务发现(Bonjour)的支持。其他操作系统…可能更棘手。
关于ZeroConf的更多信息
- http://www.zeroconf.org/
- https://en.wikipedia.org/wiki/Zero-configuration_networking
关于服务发现的更多信息,请访问
- http://www.dns-sd.org/
另一种方法,考虑到它在本地网络上的约束,可能是让您的服务器通过UDP广播数据报发布它们的存在…
然而,这几乎肯定会受到你的网络地形和防火墙/路由器规则的限制。