开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 407|回复: 8
收起左侧

[易语言] 游戏掉线断网问题如何判断

[复制链接]
结帖率:91% (29/32)
发表于 2025-10-28 01:17:49 | 显示全部楼层 |阅读模式   浙江省温州市
88精币
玩的传奇,有没有什么软件可以识别进程有没有在联网状态,初步构想是 比如时钟多少秒检查一次有没有网络流通状态,如果有就不计次  没有就计次 当计次达到一定次数就判断为掉线状态 传奇掉线了或者断网了 游戏还在 所以感觉只能这么判断 或者有大佬有更好的办法吗


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:84% (68/81)

签到天数: 1 天

发表于 2025-10-28 01:32:35 | 显示全部楼层   辽宁省葫芦岛市
RECV 或 SEND 拦截 参考乐玩模块 不考虑接收数据 只要有数据到达就说明网络是通的
回复

使用道具 举报

签到天数: 8 天

发表于 2025-10-28 07:31:03 | 显示全部楼层   广东省广州市
netstat -ano | findstr "1234"    1234是进程pid
无返回可以判断为断网,或者PID不存在
返回的信息是 TIME_WAIT或者CLOSE_WAIT,(80或443的端口除外),可以初定为断开连接
有一些传奇我记得被GM踢下线的,聊天信息还可以接收到,客户Duan也还能发包,但就是动不了。这种实际上是没有断开的,只是服务端上做了限制
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 9 天

发表于 2025-10-28 08:48:06 | 显示全部楼层   四川省成都市
先找出传奇服务器的ip,然后每秒ping一次。
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 9 天

发表于 2025-10-28 09:59:47 | 显示全部楼层   江西省南昌市
using System;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;

namespace ProcessNetworkMonitor
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("进程网络连接监控程序");
            Console.WriteLine("----------------------");

            // 配置参数
            string processName = "mir2.exe"; // 要监控的进程名
            int checkInterval = 5000; // 检查间隔(毫秒)
            int maxOfflineCount = 3; // 最大离线计数

            int offlineCount = 0;
            int processId = -1;

            while (true)
            {
                try
                {
                    // 查找目标进程
                    Process targetProcess = FindProcessByName(processName);
                    
                    if (targetProcess == null)
                    {
                        Console.WriteLine($"[{DateTime.Now}] 未找到进程: {processName}");
                        offlineCount = 0;
                        processId = -1;
                    }
                    else
                    {
                        // 如果进程ID变化,重置计数器
                        if (processId != targetProcess.Id)
                        {
                            Console.WriteLine($"[{DateTime.Now}] 发现进程: {processName} (PID: {targetProcess.Id})");
                            offlineCount = 0;
                            processId = targetProcess.Id;
                        }

                        // 检查网络连接
                        bool hasNetworkActivity = CheckProcessNetworkActivity(targetProcess.Id);
                        
                        if (hasNetworkActivity)
                        {
                            Console.WriteLine($"[{DateTime.Now}] 网络活动正常");
                            offlineCount = 0;
                        }
                        else
                        {
                            offlineCount++;
                            Console.WriteLine($"[{DateTime.Now}] 无网络活动 - 计数: {offlineCount}/{maxOfflineCount}");
                           
                            if (offlineCount >= maxOfflineCount)
                            {
                                Console.WriteLine($"[{DateTime.Now}] !!!检测到掉线!!!");
                                // 这里可以添加掉线处理逻辑,如发送通知等
                                offlineCount = 0; // 重置计数器
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"[{DateTime.Now}] 监控出错: {ex.Message}");
                }

                Thread.Sleep(checkInterval);
            }
        }

        static Process FindProcessByName(string name)
        {
            Process[] processes = Process.GetProcessesByName(name.Replace(".exe", ""));
            return processes.Length > 0 ? processes[0] : null;
        }

        static bool CheckProcessNetworkActivity(int processId)
        {
            // 获取所有TCP连接
            IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
            TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();

            foreach (TcpConnectionInformation connection in connections)
            {
                if (connection.State == TcpState.Established)
                {
                    // 检查是否有匹配的本地端口
                    if (IsPortOwnedByProcess(connection.LocalEndPoint.Port, processId))
                    {
                        return true;
                    }
                }
            }

            // 检查UDP连接(可选)
            IPEndPoint[] udpEndpoints = properties.GetActiveUdpListeners();
            foreach (IPEndPoint endpoint in udpEndpoints)
            {
                if (IsPortOwnedByProcess(endpoint.Port, processId))
                {
                    return true;
                }
            }

            return false;
        }

        static bool IsPortOwnedByProcess(int port, int processId)
        {
            // 使用netstat命令查找端口对应的进程
            // 这个方法更可靠,因为.NET API有时无法获取正确的进程ID
            
            string command = $"netstat -ano | findstr :{port}";
            Process cmdProcess = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "cmd.exe",
                    Arguments = $"/C {command}",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true
                }
            };

            cmdProcess.Start();
            string output = cmdProcess.StandardOutput.ReadToEnd();
            cmdProcess.WaitForExit();

            return output.Contains($" {processId}");
        }
    }
}
回复

使用道具 举报

结帖率:91% (29/32)

签到天数: 7 天

 楼主| 发表于 2025-10-28 14:48:45 | 显示全部楼层   浙江省温州市
RainCharm 发表于 2025-10-28 09:59
using System;
using System.Diagnostics;
using System.Net.NetworkInformation;

有易语言的代码吗
回复

使用道具 举报

结帖率:91% (29/32)

签到天数: 7 天

 楼主| 发表于 2025-10-28 14:48:57 | 显示全部楼层   浙江省温州市
zebf2014 发表于 2025-10-28 01:32
RECV 或 SEND 拦截 参考乐玩模块 不考虑接收数据 只要有数据到达就说明网络是通的 ...

有易语言的代码吗
回复

使用道具 举报

结帖率:91% (29/32)

签到天数: 7 天

 楼主| 发表于 2025-10-28 14:49:10 | 显示全部楼层   浙江省温州市
baitso 发表于 2025-10-28 07:31
netstat -ano | findstr "1234"    1234是进程pid
无返回可以判断为断网,或者PID不存在
返回的信息是 TIME ...

有易语言的代码吗
回复

使用道具 举报

结帖率:91% (29/32)

签到天数: 7 天

 楼主| 发表于 2025-10-28 14:49:24 | 显示全部楼层   浙江省温州市
frankiy 发表于 2025-10-28 08:48
先找出传奇服务器的ip,然后每秒ping一次。

有易语言的代码吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /2 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表