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

c#套接字:如何获得服务器的IP地址,而无需在客户端输入或固定IPAddress

我敢说,要找出一个特定的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广播数据报发布它们的存在…

然而,这几乎肯定会受到你的网络地形和防火墙/路由器规则的限制。