搜索
查看: 6642|回复: 21

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

[复制链接]
发表于 2005-2-19 11:47:23 | 显示全部楼层 |阅读模式 来自 中国–广东–广州
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能对此问题讨论下, 多谢!!!
 楼主| 发表于 2005-2-19 13:55:20 | 显示全部楼层 来自 中国–广东–广州
请问你们俩位都去哪了,我现在正在交换代码和数据库调试,看看关健在哪里~
回复

使用道具 举报

发表于 2005-2-19 14:19:54 | 显示全部楼层 来自 中国–陕西–西安
第一在于查询的时间
我的是按照闪闪的建议改的,在玩家连接的时候去查询
而hnroc的是在玩家完全连接入服务器时查询的

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

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

使用道具 举报

 楼主| 发表于 2005-2-19 16:27:26 | 显示全部楼层 来自 中国–广东–广州
即使玩家不多,只要执行到sql查询处就会微卡一下,你的就一点也不会,当没事通过了,呵呵~

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

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

使用道具 举报

发表于 2005-2-19 16:53:20 | 显示全部楼层 来自 中国–陕西–西安
那就只能说还有amx和amxx的mysql模块的问题了
回复

使用道具 举报

发表于 2005-2-19 18:13:19 | 显示全部楼层 来自 中国–宁夏–吴忠–青铜峡市
yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了
回复

使用道具 举报

 楼主| 发表于 2005-2-19 23:55:57 | 显示全部楼层 来自 中国–广东–广州
Post by hai1989
yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了


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



  1. #include <amxmod>
  2. #include <amxmisc>
  3. #include <mysql>

  4. #define DEBUG
  5. #define HUD_CHANNEL 9
  6. #define MSG_DELAY_TIME 5.0

  7. new g_country[32][128],g_prov[32][128],g_city[32][128],g_addr[32][255]
  8. new g_buffer[512]
  9. new bool:g_specMode[33]
  10. new bool:g_sql_statu

  11. new g_sql
  12. public plugin_init() {
  13.         register_plugin("IP to address","0.2.1","nwb13")
  14.         register_cvar("amx_mysql_host","127.0.0.1")
  15.         register_cvar("amx_mysql_user","root")
  16.         register_cvar("amx_mysql_pass","***")
  17.         register_cvar("amx_mysql_db","amx")
  18.         register_cvar("amx_mysql_table","ipdatau")
  19.         register_cvar("amx_print_chat", "1")
  20.         register_srvcmd("amx_load_ita","sql_init")

  21.         register_event("TextMsg","setSpecMode","bd","2&ec_Mod")
  22.         register_event("StatusValue","showipinfo","bd","1=2")
  23.        
  24.         new configsDir[128]
  25.         get_basedir(configsDir, 127)
  26.         server_cmd("exec %s/config/mysql.cfg", configsDir)

  27.         server_cmd("amx_load_ita")
  28. }

  29. public sql_init() {
  30.         new host[64],user[32],pass[32],db[32],table[32],error[128]
  31.         get_cvar_string("amx_mysql_host",host,63)
  32.         get_cvar_string("amx_mysql_user",user,31)
  33.         get_cvar_string("amx_mysql_pass",pass,31)
  34.         get_cvar_string("amx_mysql_db",db,31)
  35.         get_cvar_string("amx_mysql_table",table,31)
  36.         #if defined DEBUG
  37.         server_print("[AMX]Sql setting:host[%s] user[%s] password[%s] database[%s] table[%s]",host,user,pass,db,table)
  38.         #endif

  39.         #if defined DEBUG
  40.         server_print("[AMX]Start to connect sql server.")
  41.         #endif
  42.         new sql = mysql_connect(host,user,pass,db,error,127)
  43.         if (sql <= 1){
  44.                 server_print("[AMX] Connect to sql server fail, please check your settings or sql server.")
  45.                 g_sql_statu = false
  46.         }else{
  47.                 server_print("[AMX] Connect to sql server success.")
  48.                 g_sql_statu = true
  49.                 g_sql = sql
  50.         }
  51.         if (g_sql_statu == true){
  52.                 #if defined DEBUG
  53.                 server_print("[AMX]Creat table %s in sql server if it not exist.",table)
  54.                 #endif
  55.         }
  56. }

  57. public setSpecMode(id) {
  58.         new arg[12]
  59.         read_data( 2 , arg , 11 )
  60.         g_specMode[id] = ( arg[10] == '4' )  // 设置为第一人称视角
  61.         return PLUGIN_HANDLED
  62. }

  63. // ip 计算
  64. ip_to_number(userips[16]){
  65.         new ipb1[12],ipb2[12],ipb3[12],ipb4[12]
  66.         new ip
  67.         new nipb1,nipb2,nipb3,nipb4
  68.         new uip[16]
  69.         copy(uip, 16, userips)
  70.         while(replace(uip, 16, ".", " ")){}
  71.         parse(uip, ipb1, 12, ipb2, 12, ipb3, 12, ipb4, 12)
  72.         nipb1 = str_to_num(ipb1)
  73.         nipb2 = str_to_num(ipb2)
  74.         nipb3 = str_to_num(ipb3)
  75.         nipb4 = str_to_num(ipb4)
  76.         ip=nipb1*16777216 + nipb2*65536 + nipb3*256 + nipb4
  77.         return ip
  78. }

  79. public showipinfo(id){
  80.         if ( g_specMode[id] && g_sql_statu ){
  81.                     new a = read_data(2)
  82.                 if ( is_user_connected(a) ){
  83.                         new name[32]
  84.                         get_user_name(a,name,31)
  85.                         format(g_buffer,511,"%s^n来自^n%s^n%s",name,g_country[a],g_addr[a])
  86.                          set_hudmessage(200, 100, 0, 0.85, 0.35, 0, 6.0, 8.0, 0.5, 0.15, 8)  // 显示观察视角坐标 右上角
  87.                         show_hudmessage(id,g_buffer)
  88.                 }
  89.         }
  90.         return PLUGIN_HANDLED
  91. }

  92. public client_connect(id){
  93.         if (!g_sql_statu)
  94.                 return PLUGIN_HANDLED

  95.         new ipaddr,name[32],userip[16],query[1024],table[32],error[128]

  96.         get_user_ip(id,userip,16,1)
  97.         get_user_name(id,name,31)
  98.         get_cvar_string("amx_mysql_table",table,31)
  99.         ipaddr=ip_to_number(userip)
  100.         if (ipaddr >=0)
  101.                 format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d ORDER BY StartIP DESC  LIMIT 0 , 1", table, ipaddr)
  102.         else
  103.                 format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d + 4294967296 ORDER BY StartIP DESC  LIMIT 0 , 1", table, ipaddr)
  104.         // 查找需要的数据
  105.         #if defined DEBUG
  106.         new ipaddrs[17]
  107.         numtostr(ipaddr,ipaddrs,16)
  108.         //server_print("[AMX] Search data from table %s IP:%s/%s",table,ipaddrs,userip)
  109.         client_print(0,print_chat,"*[AMX] Search data from table %s IP:%s/%s",table,ipaddrs,userip)
  110.         #endif
  111.         new Res = mysql_query(g_sql,query)

  112.         if (Res < 1) {
  113.                 mysql_error(g_sql,error,127)
  114.                 server_print("[AMX] Sql error '%s', can't load address.",error)
  115.                 //mysql_free_result(Res)
  116.                 //write_to_file(id,name,userip,Res,0)
  117.                 return PLUGIN_HANDLED
  118.         }else if (Res ==0) {
  119.                 server_print("[AMX] Warning! Ip[%s] not find in sql server!",userip)
  120.                 return PLUGIN_HANDLED
  121.         }
  122.         // 读取数据
  123.         while(mysql_nextrow(Res) > 0 ) {
  124.         mysql_getfield(Res, 3, g_country[id], 127)
  125.         mysql_getfield(Res, 6, g_addr[id], 254)
  126.         }
  127.         if (strlen(g_country[id]) == 0)
  128.         if (strlen(g_addr[id]) == 0)

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

  132.         return PLUGIN_HANDLED
  133. }
  134. public client_putinserver(id){
  135.         if (!g_sql_statu)
  136.                 return PLUGIN_HANDLED

  137.         new parm[2]
  138.         parm[0] = id
  139.         set_task(MSG_DELAY_TIME,"show_msg",6666666,parm,2)
  140.         return PLUGIN_HANDLED
  141. }
  142. public client_disconnect(id){
  143.         if (g_sql_statu == false)
  144.                 return PLUGIN_HANDLED

  145.         g_country[id] = ""
  146.         g_prov[id] = ""
  147.         g_city[id] = ""
  148.         g_addr[id] = ""
  149.         new name[32]
  150.         get_user_name(id,name,31)
  151.         format(g_buffer,511,"%s 离开了服务器.^n期待你再次光临.",name)
  152.         set_hudmessage(255, 0, 255, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
  153.         show_hudmessage(0, g_buffer)
  154.         return PLUGIN_CONTINUE
  155. }

  156. public show_msg(parm[]){
  157.         new name[32],id //server_name[64],id
  158.         id = parm[0]
  159.         get_user_name(id,name,31)

  160.         format(g_buffer,511,"进入了服务器, 来自: %s, %s, 祝您玩得愉快!",g_country[id],g_addr[id])
  161.         if (get_cvar_num("amx_print_chat"))
  162.                 client_print(0,print_chat,"* %s %s",name,g_buffer)
  163.         while(replace(g_buffer, 511, " ", "")){}
  164.         while(replace(g_buffer, 511, ",", "^n")){}
  165.         while(replace(g_buffer, 511, ":", "^n")){}
  166.         format(g_buffer,511,"%s %s",name,g_buffer)
  167.         set_hudmessage(0, 255, 0, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
  168.         show_hudmessage(0, g_buffer)
  169.         return PLUGIN_CONTINUE
  170. }

  171. public plugin_end() {
  172.         if (!g_sql_statu)
  173.                 return PLUGIN_CONTINUE
  174.         mysql_close(g_sql)
  175.         server_print("[AMX] SQL Connection closed!")
  176.         return PLUGIN_CONTINUE
  177. }
复制代码



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

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

使用道具 举报

发表于 2005-2-20 00:05:18 | 显示全部楼层 来自 中国–陕西–西安
还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?!
回复

使用道具 举报

 楼主| 发表于 2005-2-20 00:13:36 | 显示全部楼层 来自 中国–广东–广州
Post by nwb13
还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?!


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

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

使用道具 举报

发表于 2005-2-20 09:07:08 | 显示全部楼层 来自 中国–宁夏–中卫
是 amx0.99的吗??我编译出现错误,郁闷
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

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