Unity游戏的局域网对战功能实现

   之前项目实现了局域网对战,看见群里有人问,献丑分享下。

    这个局域网对战功能,在PC/web/移动端上实现是一样的,可以通用。
   要实现一个游戏的局域网功能,主要实现以下三个功能点:
  1.客户端能建立主机服务。
  2.其他客户端能自动搜索到该主机
  3.其他客户端主动加入该主机。


   1. 建立主机服务, 很简单,就不细说了。


    2. 实现自动搜索该主机
              有几种实现方式:
      1.主机用UDP广播向全网段广播自己的地址
        当客户端启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,广播包内容包含用户名、工作组、主机名、IP等信息,收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表。 
      2. 用TCP syn包扫描获取ack。  或者用Udp的ICMP包。其实Udp的ICMP包在某些被屏蔽的情况是无法获得地址的,但我们自己的游戏不存在这个问题。
      3.  最简单的一种 见回复内容。

[hide]using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using UnityEngine;

public class PingSocket : MonoBehaviour
{

    List<string> ipList = new List<string>();

    public void DoGetIP()
    {
        //Thread
        StartCoroutine(getIP());
    }

    IEnumerator getIP()
    {
        yield return new WaitForSeconds(1f);

        //获取本地机器名 
        string _myHostName = Dns.GetHostName();
        //获取本机IP 
        string _myHostIP = Dns.GetHostEntry(_myHostName).AddressList[0].ToString();

        //截取IP网段
        string ipDuan = _myHostIP.Remove(_myHostIP.LastIndexOf('.'));
        //string ipDuan = "192.168.0";
        //枚举网段计算机
        for (int i = 1; i <= 255; i++)
        {
            System.Net.NetworkInformation.Ping myPing = new System.Net.NetworkInformation.Ping();
            myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);
            string pingIP = ipDuan + "." + i.ToString();
            myPing.SendAsync(pingIP, 500, null);

        }
    }
    void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
    {
        if (e.Reply.Status == IPStatus.Success)
        {
            ipList.Add(e.Reply.Address.ToString());
        }

        Debugerr.LogJLError("局域网主机---" + e.Reply.Address.ToString());
    }
}


其实ping使用的也是ICMP包,只是系统帮我们实现了。
     


      
  
   

转载于:https://www.cnblogs.com/sundayofit/p/7995470.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值