我在做一个局域网游戏。一个玩家先建立房间(作主机),其他玩家加入。我想让其他玩家方便一点,提供给自动搜索按钮,能找出局域网内已经建立的游戏房。求思路或算法。

解决方案 »

  1.   

    向255广播地址发送你自己的ip地址和端口,如果当前网段有机器就通过ip回你,你再去连它
      

  2.   

    哦。。看懂了,你说得好简洁。我后来才突然想到广播这个方法的,现在看起来原来你说的就是我想到的方法。。这是我实现的代码。
            /// <summary>
            /// 客户端若想要寻找服务端,可以调用一次此方法。
            /// 每发现一个服务端,就进行一次callback回调。此方法永不返回。
            /// </summary>
            /// <param name="callback"></param>
            public void FindServer(Action<IPAddress> callback)
            {
                //Console.WriteLine(IPAddress.Broadcast);
                clientUdp = new UdpClient();
                IPEndPoint broadcastEndPoint = new IPEndPoint(IPAddress.Broadcast, serverListeningPort);
                clientUdp.Send(new byte[] { MessagesSentByClient.WantServer }, 1, broadcastEndPoint);            for (; ; )
                {
                    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    var bytes = clientUdp.Receive(ref remoteIpEndPoint);
                    if (bytes[0] == MessagesSentByServer.HereIsServer)
                    {
                        Console.WriteLine(remoteIpEndPoint + ": 收到服务器的回复");
                        callback(remoteIpEndPoint.Address);
                    }            }
            }        /// <summary>
            /// 服务端若想要自动被发现,则可以在一条线程中运行此方法。此方法永不返回。
            /// </summary>
            public void WaitFind()
            {
                serverUdp = new UdpClient(serverListeningPort);
                for (; ; )
                {
                    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    var bytes = serverUdp.Receive(ref remoteIpEndPoint);
                    if (bytes.Length == 1 && bytes[0] == MessagesSentByClient.WantServer)
                    {
                        Console.WriteLine(remoteIpEndPoint + ": WantServer");
                        serverUdp.Send(new[] { MessagesSentByServer.HereIsServer }, 1, remoteIpEndPoint);
                    }            }
            }