클라이언트 앱이 C#의 로컬 네트워크에서 서버를 찾는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/210446

문제

클라이언트는 진지대를 사용하여 서버에 연결합니다 (우리는 DotNetremoting으로 전환하는 것을 고려하고 있습니다). 내가 찾은 것은 연결할 서버의 IP와 포트 번호를 얻는 것입니다.

네트워크의 모든 IP가 활성 포트를 시도해보십시오 (가능하지만 확실하지 않음)의 중단기 접근 방식이 시도되는 것처럼 보이지만 더 나은 방법이 있어야합니다.

도움이 되었습니까?

해결책

특정 UDP 패킷을 방송하는 것을 고려하십시오. 서버 나 서버가 방송 된 UDP 패킷을 볼 때 회신을 보냅니다. 클라이언트는 모든 서버에서 답장을 수집하고 선거 알고리즘을 기반으로 또는 선거 알고리즘을 기반으로 연결을 시작할 수 있습니다.

클라이언트의 예를 참조하십시오 (테스트되지 않은 코드):


using System.Net;
using System.Net.Sockets;

[STAThread]
static void Main(string[] args)
{
    Socket socket = new Socket(AddressFamily.InterNetwork,
    SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Any, 8002));
    socket.Connect(new IPEndPoint(IPAddress.Broadcast, 8001));
    socket.Send(System.Text.ASCIIEncoding.ASCII.GetBytes("hello"));

    int availableBytes = socket.Available;
    if (availableBytes > 0)
    {
        byte[] buffer = new byte[availableBytes];
        socket.Receive(buffer, 0, availableBytes, SocketFlags.None);
        // buffer has the information on how to connect to the server
    }
}

다른 팁

가장 좋은 방법은 C#에 Bonjour/Zeroconf/MDNS를 사용하는 것입니다. 많은 생각이 네트워크와 잘 어울 렸습니다. 즉, 가능하면 시간이 지남에 따라 덜 자주 핑을합니다. mono.zeroconf, 그리고 나는 더 오래된 .NET 프로젝트가 있습니다. Apple SDK 그러나 나는 그것을 찾지 못했습니다.

따라서 가장 쉬운 것은 설치하는 것입니다 Windows 용 Bonjour, 그 다음을 얻으십시오 mono.zeroconf 용 Windows Binaries 예제를 시도하십시오 MZClient.exe 떨어 뜨립니다 Mono.Zeroconf.dll 및/또는 Mono.Zeroconf.Providers.Bonjour.dll 프로젝트 참조로 이동하십시오.

이 같은:

var service = new Mono.Zeroconf.RegisterService {
                Name = "Use Me for Stuff",
                RegType = "_daap._tcp",
                ReplyDomain = "local.",
                Port = 0024200,
                TxtRecord = new Mono.Zeroconf.TxtRecord {
                            {"I have no idea what's going on", "true"}}
              };
service.Register();

var browser = new Mono.Zeroconf.ServiceBrowser();
browser.ServiceAdded +=
    delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
        Console.WriteLine("Found Service: {0}", args.Service.Name);
        args.Service.Resolved +=
            delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
                var s = args.Service;
                Console.WriteLine(
                    "Resolved Service: {0} - {1}:{2} ({3} TXT record entries)",
                    s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count);
          };
        args.Service.Resolve();
    };
browser.Browse("_daap._tcp", "local");

대체 Zeroconf Nuget 패키지를 지적하고 싶었습니다. Zeroconf. 기본 종속성이 없으므로 Windows 또는 다른 용기에 Bonjour를 설치할 필요가 없습니다.

.NET 4.5, WP8 및 Win8을 지원합니다.

WS-Discovery는이 목적을위한 프로토콜입니다. 그것은 몇 가지 다른 변형, 방송 및 프록시의 다양한 맛이 있습니다. http://en.wikipedia.org/wiki/ws-discovery

.NET WCF4가이를 구현합니다.

서버가 네트워크의 특정 포트에서 브로드 캐스트를 듣게되도록하십시오 (UDP를 사용해야 함) 클라이언트가 시작되면 해당 포트에 "핑"요청을 방송 할 수 있습니다. 서버가 "핑"을 볼 때 클라이언트가 연결하는 데 필요한 TCP 주소와 포트가있는 메시지를 다시 보냅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top