문제

후속 조치로 이 질문 로컬 컴퓨터에서 작동하는 솔루션을 얻었지만 네트워크의 기계에는 없습니다.

나는 그 기본 이외의 소켓에 대해 너무 많이 알지 못하므로 저와 함께하십시오. 목표는 클라이언트가 로컬 네트워크에서 서버를 찾는 것이며, 이는 일부 잘라/붙여 넣기/편집의 결과입니다.

이것은 클라이언트 코드입니다.

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);

    byte[] data = new byte[1024];
    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {

        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
        string welcome = "What's your IP?";
        data = Encoding.ASCII.GetBytes(welcome);
        client.SendTo(data, data.Length, SocketFlags.None, ipep);
        IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
        EndPoint tmpRemote = (EndPoint)server;
        data = new byte[1024];
        int recv = client.ReceiveFrom(data, ref tmpRemote);
        this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
        this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox
        client.Close();
    }

이것은 서버 코드입니다.

int recv;
        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294);
        Socket newsock = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);
        newsock.Bind(ipep);
        newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1")));

        while (true)
        {
            Console.WriteLine("Waiting for a client...");
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint tmpRemote = (EndPoint)(sender);
            data = new byte[1024];
            recv = newsock.ReceiveFrom(data, ref tmpRemote);
            Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
            string welcome = "7010";
            data = Encoding.ASCII.GetBytes(welcome);
            newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote);
        }

그것은 내 로컬 컴퓨터 (서버 및 클라이언트 모두)에서 찾을 수 있지만 같은 네트워크에서 다른 컴퓨터를 시도하면 "기존 연결이 원격 호스트가 강제로 닫았습니다".

나는 많은 시도/캐치를 추가해야한다는 것을 알고 있지만, 이것이 먼저 어떻게 작동하는지에 대한 손잡이를 얻으려고 노력하고 있습니다.

도움이 되었습니까?

해결책

나는 C#에 대해 아무것도 모른다고 말하면서 시작해야하지만 ...

정의를보고 있습니다 ipep 클라이언트 코드에서는 데이터를 방송하기보다는 자신에게 데이터를 보내려고하는 것처럼 보입니다 (다른 질문에서 제안 된 바와 같이). 내 관심을 끌었던 것은 "127.0.0.1"은 "LocalHost"의 주소라는 것입니다.

그것은 하나의 컴퓨터에서 클라이언트와 서버를 모두 실행할 때 왜 잘 작동하는지 설명합니다. ~ 할 것이다 스스로에게 보내십시오.

올바른 엔드 포인트는 브로드 캐스트 주소 (예 : "255.255.255.255")에 대한 것이 될 것으로 예상합니다.

다른 팁

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);

가야합니다 :

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294);

그리고

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1")));

있어야합니다

newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));

제 생각에는.

좋아, 이것은 작동하지 않으므로 여전히 뭔가 잘못되었습니다.

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