文章目录

  • 一、导语
  • 二、准备工作
  • 三、操作步骤
    • 1.打开虚拟机并连接vpn
    • 2.adb连接
    • 3.拷入并执行转发程序
    • 4.打开游戏,建立主机
  • 四、具体原理
  • 五、结语
  • 六、附件
    • 1.udp_proxy源码
    • 2.建连过程抓包截图

一、导语

元气骑士是一个可以局域网联机的手机游戏,我觉得还挺好玩的。希望能够和远方的好基友一起玩,在网络上没有找到对应的方法。就自己研究了一下,目前可以实现双人联机,3人及以上联机没有试过,需要的话可以看下面的分析过程自己改看看udp_proxy,应该问题不大。注意:本指南要一定的电脑基础。嗯,就这样,如果其中有不懂的请自行搜索。
简单介绍下我的方法,首先基础还是两台设备都需要接入vpn。而我的办法是解决vpn下无法建连的问题的。

二、准备工作

要进行远程联机有几点你需要准备,而我并不会告诉你怎么弄,请自行google:
1.vpn
用来让两台android设备直接通讯,或者你可以用其他手段,只要你能让两台设备互相发送udp包就可以。我的方法是在自己的阿里云服务器上搭了一个openvpn
2.一台获得root权限的android设备
由于元气骑士建连实现方式的原因,无法直接通过vpn连接成功,需要进行一个建连数据包的转发动作。目前我的方法是直接在内核层写了一个C程序进行数据包的转发。我不想把日常手机root,而有权限的旧手机也太久没用了,所以最后用的是夜神模拟器

三、操作步骤

1.打开虚拟机并连接vpn

这个没什么好说的,连上你的vpn后看看自己的vpn地址。
再要到对端的vpn地址就行。

2.adb连接

夜神有自带的adb工具,虽然比正常的adb难用一些,不过如果你没有什么深入玩android中Linux层的东西的话,能够将就着先用。
①找到你的夜神安装路径,我的路径为:D:\Program Files\Nox\bin
②在cmd中进入这个路径,输入以下指令(PS:我截图中由于我有配置环境变量所以没有进入该路径):

 adb connect 127.0.0.1:62001adb shell

记得adb shell的指令还需要敲入一个回车键。
回车完之后如果出现上图的root@android:/ #证明成功,已经进入android系统的调试模式。
注意,前面要是root才是开启root成功。

3.拷入并执行转发程序

先退出来,在上面的cmd命令栏中输入“exit”退出adb,或者新开一个cmd。

输入下面指令,将转发文件导入系统。前面的是转发程序所在的路径,后面的是放入android里的路径。

adb push C:\Users\lyn\Desktop\yuanqi_bin\udp_proxy_x86 /data/local

出现下图中的输出代表成功。
注:这里用Push命令的时候要注意一点,我的proxy文件的路径中存在中文的话造成了传输的异常,好像不是一个必现的问题,但是最好还是不要让文件路径存在中文。


夜神里面用的是x86的版本,普通手机可以试试这个arm版本的。
arm版本我只在genymotion上面测试可以,如果可以手机上可以用的话请告诉我一下。
下面是下载链接,好吧,还挺无语的,我本来想直接当做附件放在这里,好像没有这个选项。
而且资源最少也是要设置1分。
https://download.csdn.net/download/u013113491/10838355
没分数的朋友也不用纠结,下面是百度盘地址。
链接:https://pan.baidu.com/s/1-9asWzAE7rdh1o4UDMCm4w
提取码:iiu2

然后进入该路径

授予程序执行和权限 “chmod 777 udp_proxy_x86”
下面一行是启动指令,-d代表debug模式,23333是监听和目标端口,"10.8.0.10"地方请输入你要联机的对方的vpn的Ip地址。

 ./udp_proxy_x86 -d 23333 10.8.0.10//对方vpn地址

4.打开游戏,建立主机

注意:一定要在上面的转发程序启动后再开启主机,否则转发程序会启动失败。
这个就不用我教你了吧。一切顺利的话adb里面会输出以下信息(当然,ip地址会不一样),这是接收到了建连广播包的信号。

这时候让对方在多人游戏里面加入游戏,就可以看到你的主机信息了,开心的联机吧。(说机不说吧,罪过罪过。)

四、具体原理

接下来的部分如果你联机遇到问题或者是你想多了解一些,可以继续往下看。
我们设定C1和C2之间的关系是下面这样的,如果你说C2可以连到你家的WIFI请右上角,不用继续往下看。

你需要知道的两个基本原理有:
①udp广播机制。
②没了,就这一个。

其实在我们建立好vpn通道之后,其实两个手机之间已经可以直(间?)接通过vpn分配的ip地址进行通信了。
在一般的游戏联机模式中,我们在搜索的主机地址中填下vpn的ip地址后就可以建连了。
可能是出于自身为手机游戏的考虑,元气骑士在建连过程中没有使用PC游戏常见的直联IP联机的方式。
而是使用了udp广播的机制。在udp广播中,程序会向路由器的广播地址发送数据包。该数据包随后会被广播给这个局域网段内的所有机器。虽然我不知道数据包里面包含了什么东西,但应该是主机的基本信息之类的数据。后续收到主机数据包的机子在打算加入房间时会通过这个包的一些ip数据之类的和主机进行P2P连接。

再说回元气,下图是我测试的时候用wireshark抓到的广播数据包。可以看出他会发给同一网段内的255这个地址,23333端口。
下面这些数据包,只要是同一个网段中的打开了23333端口的设备都能收到。

不过udp广播网段在元气的远程联机中存在两个问题:
第一:不知道是VPN的原因还是元气骑士的设置原因,在我测试的过程中,他发过eth1网卡和wlan0网卡所在网段的广播包,没有发过tun0网段的广播包。可以参考我下图中的网卡信息对照我udp_proxy的输出截图,有192.168.50网段和172.17.99网段的广播包,却没有这个10.8.0网段的。
第二:由于android系统上面openvpn无法通过普通手段使用TAP模式,而我们使用的TUN模式没有办法转发广播数据包。


所以我们需要自行转发建连数据包。

关于解决UDP包转发问题,可以参考以下的链接:
https://codeday.me/bug/20181119/401579.html
上面连接中的最佳答案中给出的链接就是下面这个链接,下面这个链接提供了一个udp_proxy程序能够进行udp包的转发操作。
我完全使用了下面链接中的程序,做的只是进行了android x86、arm平台下的交叉编译工作。
http://www.vttoth.com/CMS/index.php/technical-notes/63#Appendix

我原本的打算是如下图计划一这样,做一个中转手来转发数据包。

没想到我的一个误操作外打正着,实现了一个更简单的结构:
正常的联机过程中,C2在需要连接到主机的时候,会往主机的23333端口发送连接数据,完成连接。如下图中这三个包。

而我在测试中误用了一个原版,未修改的udp_proxy进行测试。上文原版的udp_proxy会把发包源地址的端口设置的和目标地址的端口一样。我们想要将数据包发往C2的23333端口,udp_proxy原本的实现却会把本机的23333端口也进行注册,这个端口原本应该是由元气骑士进行注册的。我们使用23333端口之后,会收到元气骑士发出的UDP广播包,所以我们也不需要上图计划一中的转发机充当二传手。而23333端口被我们的udp_proxy占用之后,元气骑士似乎会自行换一个端口,并且将这个端口的信息放在主机信息数据包里面一起发送给C2,所以不用担心元气骑士的建连问题。这也是为什么上面步骤中强调要先启动转发程序的原因。

建连完成后转发程序就没什么用了,因为两个客户端会直接通讯。所以你可以关掉,不过最好是留着。省的有时候掉出房间需要重新连接。

五、结语

还是挺好玩的,不管是游戏还是找寻建连解决方法。其实VPN已经处理了游戏连接基本问题。不过由于这个游戏的特殊性,需要再多做一个动作。希望以后手游也能多多出一些这样可以联机的独立游戏啊。
拖拖拉拉终于把这件事情搞定了,如果以后有什么好玩又有网络相关问题的游戏,可以告诉我,说不定我还能瞎猫碰到死耗子呢~
我是llsxily,兴趣是人最好的老师,你可以叫我橘子。
PS:最后附上一些小东西。

六、附件

1.udp_proxy源码

下面是udp_proxy源码,当然你也可以去上面那个链接里面的地址里面下载。

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <syslog.h>void main(int argc, char *argv[])
{struct sockaddr_in saSRC, saDST, saRCV;char cBuf[1<<16];int sSRC, sDST;struct hostent *ph;int nLen;int bDebug = 0;int on = 1;pid_t pid;int nAS;unsigned long aRCV, aDST;int i;char *pszApp = *argv++;if (argc > 1 && !strcmp(*argv, "-d")){printf("Debug mode.\n");bDebug = 1;argc--;argv++;}if (argc != 3){printf(" LYN:charge Usage: %s [-d] port-number ip-address\n", pszApp);exit(1);}ph = gethostbyname(argv[1]);if (ph == NULL){printf("Invalid address\n");exit(1);}//设置接收数据ip地址配置数据saDST.sin_family = AF_INET;saDST.sin_port = htons(atoi(argv[0]));saDST.sin_addr.s_addr = *((unsigned long *)ph->h_addr);//设置发出放数据ip地址配置数据saSRC.sin_family = AF_INET;saSRC.sin_port = saDST.sin_port;//modify by lyn//设置接收端口//saSRC.sin_port = 32147;saSRC.sin_addr.s_addr = 0;sSRC = socket(AF_INET, SOCK_DGRAM, 0);sDST = socket(AF_INET, SOCK_DGRAM, 0);//绑定端口if (bind(sSRC, (struct sockaddr *)&saSRC, sizeof(saSRC))){printf("Unable to bind to socket\n");exit(1);}setsockopt(sDST, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));if (!bDebug){close(0);close(1);close(2);pid = fork();if (pid < 0) syslog(LOG_ERR, "Could not go into background.");if (pid > 0) exit(0);}aDST = htonl(saDST.sin_addr.s_addr);while (1){nAS = sizeof(saRCV);nLen = recvfrom(sSRC, cBuf, sizeof(cBuf), 0, (struct sockaddr *)&saRCV, &nAS);// Imperfect method for filtering loopback of broadcast packets;// it may also filter packets from certain hosts on the local// network, but for our purposes, that's irrelevant.aRCV = htonl(saRCV.sin_addr.s_addr);for (i = 0; i < 32; i++){if (!(aDST & (1 << i))) break;aRCV |= (1 << i);}if (nLen > 0 && aRCV != aDST){if (bDebug)printf("Relaying a packet of length %d from %d.%d.%d.%d.\n",nLen,((unsigned char *)&saRCV.sin_addr.s_addr)[0],((unsigned char *)&saRCV.sin_addr.s_addr)[1],((unsigned char *)&saRCV.sin_addr.s_addr)[2],((unsigned char *)&saRCV.sin_addr.s_addr)[3]);sendto(sDST, cBuf, nLen, 0, (struct sockaddr *)&saDST, sizeof(saDST));}}
}

2.建连过程抓包截图

我本来想把整个建连流程的pcap文件放上来的,但是这个附件真的是有点坑,我就截取其中的重要部分传上来好了。

元气骑士双人远程联机指南相关推荐

  1. 元气骑士双人异地公网联机工具(仅支持双人、JAVA实现)

    环境准备 腾讯云/阿里云服务器一台,如果能搞到学生机的话是很便宜的 两台电脑,台式笔记本都行 电脑和服务器需要配置JAVA环境 下载client.jar与server.jar 服务器上的操作 将ser ...

  2. 计算机网络实践之元气骑士公网异地联机(二) 两种方案可行性分析

    前言 在上一篇中,我已经通过分析得知了元气骑士在局域网联机过程中是通过UDP进行交互的,只要我们能正确的转发这些UDP消息,就能实现异地公网的联机了.转发UDP消息通常有两种方案:一个是通过UDP穿透 ...

  3. 计算机网络实践之元气骑士公网异地联机(三) 完善转发机的转发规则

    计算机网络实践之元气骑士公网异地联机(三) 完善转发机的转发规则 前言 在上一篇中,我通过表格对转发机的监听端口和转发逻辑进行了简短的描述. 转发机 监听端口 主机A 23333.8888.8888端 ...

  4. 计算机网络实践之元气骑士公网异地联机(一) 初探局域网联机过程

    前言 元气骑士作为当下热门的单机游戏,很多人都在琢么怎么和好朋友即使不在一个局域网内也能一起玩耍.目前网上比较成熟的方案是在服务器上搭建VPN,两个手机通过连接VPN来穿透内网,实现彼此的连通,再通过 ...

  5. 元气骑士多终端跨网远程联机解决方案

    受到元气骑士双人远程联机指南的启发,在这篇文章的基础上完成了最多支持4人同时联机的relayer. 具体要求同以上文章. 所有资源一同放在github: SoulKnight-Remote 下面的内容 ...

  6. 元气骑士+蒲公英联机平台联机教程

    所需软件: 1.元气骑士主机小工具 2.元气骑士游戏APP 3.蒲公英联机平台(现仅Android版) 操作流程: 1.下载蒲公英联机平台APP 2.打开APP,登录/注册帐号,进入APP: 3.进入 ...

  7. 元气骑士 自建服务器,七夕元气骑士联机盒子服务器官方版

    七夕元气骑士联机盒子是一款可以带来热血地牢大冒险的动作游戏,拥有着超多特色的作战玩法可以在游戏里尽情的展开冒险,让你能够成为强大的地牢战神,不断在战斗讨伐之中成长自身,通过不断的杀戮来获得强力装备,不 ...

  8. 登入联机服务器失败怎么 修复,元气骑士连接服务器失败 连接不上网络怎么办...

    元气骑士连接服务器失败 连接不上网络怎么办.元气骑士是一款非常好玩的网络游戏,许多游戏爱好者进入游戏想领略它的玩法,但是近日有许多小伙伴反应一直连接不上服务器,一打开就是连接网络失败这样的界面.那么这 ...

  9. ios远程服务器,整理一下苹果手机ios远程联机教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 整理一下这几天所了解的苹果手机ios远程联机教程. 以下纯手打的,有需要的认真看完. 声明:以下只是本人整理给新人看的,让大家少走弯路,希望越来越多ios ...

  10. 联机系统的服务器,远程联机服务器系统

    远程联机服务器系统 内容精选 换一换 Windows操作系统的本地PC,通过RDP协议(如MSTSC方式)远程桌面连接Windows云服务器报错,报错显示出现身份验证错误,要求的函数不受支持.如果报错 ...

最新文章

  1. Forever +nginx部署Node站点
  2. 怼天怼地怼空气的Linus 喜欢和什么样的人一起工作?
  3. 链接克隆 完整克隆_深入克隆
  4. 在excel上画交换机面板_如何在Excel中创建面板图
  5. 魅族可以Android编程吗,魅族 - 融云开发文档
  6. AVS2实时编码器xavs2的运行
  7. PhpStorm 正则 小写变大写
  8. 【IPv6】NS,NA 报文学习
  9. 架构之——umi框架与dva的使用
  10. iPad上的数学软件介绍与畅想
  11. 贾扬清:如何看待人工智能方向的重要问题?
  12. Python 决策树预测 分类算法
  13. 【神经网络】6.1 神经网络基础
  14. 测试人员必备-用adb抓取APP日志的方法
  15. MarkDown使用代码
  16. ncurses库移植到arm平台
  17. 爱丁堡大学—计算机应用数学,爱丁堡大学计算机应用数学理学硕士
  18. 为了看看程序员常用什么工具软件,我“黑”进了技术部的收藏夹
  19. EXCEL之进销管理系统
  20. 网易人工智能事业部java实习生面经

热门文章

  1. 【神经网络】权重衰减(weight-decay)
  2. python整蛊代码+详解
  3. 个人博客百度统计中恶意刷无关关键词解决方案
  4. 计算机课件白板培训,交互式电子白板的使用培训(1)(2)ppt课件
  5. 迭代局部搜索算法(Iterated local search)
  6. PB 各种小技巧(二)
  7. 纯干货:微软漏洞中国第一人黄正——如何用正确姿势挖掘浏览器漏洞(附完整 PPT)
  8. Rundll32.exe使用方法大全
  9. java数据透视表算法_用Java Steams创建数据透视表
  10. 你能获得的数据量越大,你能挖掘到的价值就越多。