yanexp 发表于 2005-2-19 11:47:23

【讨论】奇怪了,关于nwb13与hnroc 两者的显IP地址插件问题!

nwb13
2005-1-15 显示地址插件 AMXX1.0 版
http://forum.dt-club.net/showthread.php?t=17354

hnroc
显示IP及城市插件 for amx0.9.9详细制作方法!
http://forum.dt-club.net/showthread.php?t=17495


【讨论】:
我这因为一直使用AMX版插件,之前就用了hnroc提供的显IP地址插件,发觉每有玩家登录后在服务器执行IP查询时总会卡一下,

今天我试着将nwb13的AMXX1.0 版改为AMX版,已经正常使用中,可是并没有像hnroc那个会有卡机的现象,真是奇怪了,不知关健原因是什么,难道是两者因为使用不同的sql查询方式,IP数据差不多相同的情况下,nwb13的查询方式并不会引起服务器卡现象,并很顺畅得到地址,我真想不通了

希望nwb13和hnroc能对此问题讨论下, 多谢!!!

yanexp 发表于 2005-2-19 13:55:20

请问你们俩位都去哪了,我现在正在交换代码和数据库调试,看看关健在哪里~

nwb13 发表于 2005-2-19 14:19:54

第一在于查询的时间
我的是按照闪闪的建议改的,在玩家连接的时候去查询
而hnroc的是在玩家完全连接入服务器时查询的

第二是连接的数量
我的是只有一个连接存在
hnroc的是有可能多个连接同时存在

你可以仔细看看代码中的区别
对了,hnroc的帖子后有我跟的帖子,里面有我对他的版本优化后的代码,你试试看

yanexp 发表于 2005-2-19 16:27:26

即使玩家不多,只要执行到sql查询处就会微卡一下,你的就一点也不会,当没事通过了,呵呵~

我试了你优先后的代码也会卡一下呀,真不明白了

卡当然不会是很明显,只不过在流量状态那可以看出来

nwb13 发表于 2005-2-19 16:53:20

那就只能说还有amx和amxx的mysql模块的问题了

hai1989 发表于 2005-2-19 18:13:19

yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了

yanexp 发表于 2005-2-19 23:55:57

Post by hai1989
yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了

好的,当然没问题,以下是我改好后的AMX版显IP地址插件



#include <amxmod>
#include <amxmisc>
#include <mysql>

#define DEBUG
#define HUD_CHANNEL 9
#define MSG_DELAY_TIME 5.0

new g_country,g_prov,g_city,g_addr
new g_buffer
new bool:g_specMode
new bool:g_sql_statu

new g_sql
public plugin_init() {
        register_plugin("IP to address","0.2.1","nwb13")
        register_cvar("amx_mysql_host","127.0.0.1")
        register_cvar("amx_mysql_user","root")
        register_cvar("amx_mysql_pass","***")
        register_cvar("amx_mysql_db","amx")
        register_cvar("amx_mysql_table","ipdatau")
        register_cvar("amx_print_chat", "1")
        register_srvcmd("amx_load_ita","sql_init")

        register_event("TextMsg","setSpecMode","bd","2&ec_Mod")
        register_event("StatusValue","showipinfo","bd","1=2")
       
        new configsDir
        get_basedir(configsDir, 127)
        server_cmd("exec %s/config/mysql.cfg", configsDir)

        server_cmd("amx_load_ita")
}

public sql_init() {
        new host,user,pass,db,table,error
        get_cvar_string("amx_mysql_host",host,63)
        get_cvar_string("amx_mysql_user",user,31)
        get_cvar_string("amx_mysql_pass",pass,31)
        get_cvar_string("amx_mysql_db",db,31)
        get_cvar_string("amx_mysql_table",table,31)
        #if defined DEBUG
        server_print("Sql setting:host[%s] user[%s] password[%s] database[%s] table[%s]",host,user,pass,db,table)
        #endif

        #if defined DEBUG
        server_print("Start to connect sql server.")
        #endif
        new sql = mysql_connect(host,user,pass,db,error,127)
        if (sql <= 1){
                server_print(" Connect to sql server fail, please check your settings or sql server.")
                g_sql_statu = false
        }else{
                server_print(" Connect to sql server success.")
                g_sql_statu = true
                g_sql = sql
        }
        if (g_sql_statu == true){
                #if defined DEBUG
                server_print("Creat table %s in sql server if it not exist.",table)
                #endif
        }
}

public setSpecMode(id) {
        new arg
        read_data( 2 , arg , 11 )
        g_specMode = ( arg == '4' )// 设置为第一人称视角
        return PLUGIN_HANDLED
}

// ip 计算
ip_to_number(userips){
        new ipb1,ipb2,ipb3,ipb4
        new ip
        new nipb1,nipb2,nipb3,nipb4
        new uip
        copy(uip, 16, userips)
        while(replace(uip, 16, ".", " ")){}
        parse(uip, ipb1, 12, ipb2, 12, ipb3, 12, ipb4, 12)
        nipb1 = str_to_num(ipb1)
        nipb2 = str_to_num(ipb2)
        nipb3 = str_to_num(ipb3)
        nipb4 = str_to_num(ipb4)
        ip=nipb1*16777216 + nipb2*65536 + nipb3*256 + nipb4
        return ip
}

public showipinfo(id){
        if ( g_specMode && g_sql_statu ){
                    new a = read_data(2)
                if ( is_user_connected(a) ){
                        new name
                        get_user_name(a,name,31)
                        format(g_buffer,511,"%s^n来自^n%s^n%s",name,g_country,g_addr)
                       set_hudmessage(200, 100, 0, 0.85, 0.35, 0, 6.0, 8.0, 0.5, 0.15, 8)// 显示观察视角坐标 右上角
                        show_hudmessage(id,g_buffer)
                }
        }
        return PLUGIN_HANDLED
}

public client_connect(id){
        if (!g_sql_statu)
                return PLUGIN_HANDLED

        new ipaddr,name,userip,query,table,error

        get_user_ip(id,userip,16,1)
        get_user_name(id,name,31)
        get_cvar_string("amx_mysql_table",table,31)
        ipaddr=ip_to_number(userip)
        if (ipaddr >=0)
                format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d ORDER BY StartIP DESCLIMIT 0 , 1", table, ipaddr)
        else
                format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d + 4294967296 ORDER BY StartIP DESCLIMIT 0 , 1", table, ipaddr)
        // 查找需要的数据
        #if defined DEBUG
        new ipaddrs
        numtostr(ipaddr,ipaddrs,16)
        //server_print(" Search data from table %s IP:%s/%s",table,ipaddrs,userip)
      client_print(0,print_chat,"* Search data from table %s IP:%s/%s",table,ipaddrs,userip)
        #endif
        new Res = mysql_query(g_sql,query)

        if (Res < 1) {
                mysql_error(g_sql,error,127)
                server_print(" Sql error '%s', can't load address.",error)
                //mysql_free_result(Res)
                //write_to_file(id,name,userip,Res,0)
                return PLUGIN_HANDLED
        }else if (Res ==0) {
                server_print(" Warning! Ip[%s] not find in sql server!",userip)
                return PLUGIN_HANDLED
        }
        // 读取数据
        while(mysql_nextrow(Res) > 0 ) {
        mysql_getfield(Res, 3, g_country, 127)
        mysql_getfield(Res, 6, g_addr, 254)
        }
        if (strlen(g_country) == 0)
        if (strlen(g_addr) == 0)

        #if defined DEBUG
        server_print(" Read address success! Player[%s] IP[%s] address[%s, %s, %s, %s]", name, userip, g_country, g_prov, g_city, g_addr)
        #endif

        return PLUGIN_HANDLED
}
public client_putinserver(id){
        if (!g_sql_statu)
                return PLUGIN_HANDLED

        new parm
        parm = id
        set_task(MSG_DELAY_TIME,"show_msg",6666666,parm,2)
        return PLUGIN_HANDLED
}
public client_disconnect(id){
        if (g_sql_statu == false)
                return PLUGIN_HANDLED

        g_country = ""
        g_prov = ""
        g_city = ""
        g_addr = ""
        new name
        get_user_name(id,name,31)
        format(g_buffer,511,"%s 离开了服务器.^n期待你再次光临.",name)
        set_hudmessage(255, 0, 255, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
        show_hudmessage(0, g_buffer)
        return PLUGIN_CONTINUE
}

public show_msg(parm[]){
        new name,id //server_name,id
        id = parm
        get_user_name(id,name,31)

        format(g_buffer,511,"进入了服务器, 来自: %s, %s, 祝您玩得愉快!",g_country,g_addr)
        if (get_cvar_num("amx_print_chat"))
                client_print(0,print_chat,"* %s %s",name,g_buffer)
        while(replace(g_buffer, 511, " ", "")){}
        while(replace(g_buffer, 511, ",", "^n")){}
        while(replace(g_buffer, 511, ":", "^n")){}
        format(g_buffer,511,"%s %s",name,g_buffer)
        set_hudmessage(0, 255, 0, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
        show_hudmessage(0, g_buffer)
        return PLUGIN_CONTINUE
}

public plugin_end() {
        if (!g_sql_statu)
                return PLUGIN_CONTINUE
        mysql_close(g_sql)
        server_print(" SQL Connection closed!")
        return PLUGIN_CONTINUE
}



数据我是使用
显示玩家IP及城市插件的2月10日IP库
http://www.dt-club.net/showthread.php?t=18240

欢迎大家继续讨论这个问题!!!

nwb13 发表于 2005-2-20 00:05:18

还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?!

yanexp 发表于 2005-2-20 00:13:36

Post by nwb13
还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?!

我也觉得可能是那段IP转换的代码的问题了,不过还没空试,

要交换代码和数据表才知结果

hai1989 发表于 2005-2-20 09:07:08

是 amx0.99的吗??我编译出现错误,郁闷
页: [1] 2 3
查看完整版本: 【讨论】奇怪了,关于nwb13与hnroc 两者的显IP地址插件问题!