小铁匠挂机V8.7

小铁匠挂机V8.7

小铁匠挂机V8.7.zip <------------正常用户使用

小铁匠挂机V8.7注册码版.zip <------------特殊老用户使用(即之前一直用注册码模式的用户)

 

当前更新内容(增加挂武斗场

修正反复锻炼问题,做料理个数可自定义,修复自动卖武器

增加三色丸子+3

修复宝石数量显示问题

修复仙人跑路问题

进房间排除工会及密码房

增加维持强化,绿茶料理支持,修正Win7兑奖功能(XP不支持))

1.修复等人对方准备自动准备

2.修复Win7下兑奖功能
3.任务改为家门口进
4.随游戏更新地图及料理流程


使用方法:
先开脚本后从窗口化工具的一键设置工具中开游戏,然后直接在家里按F10就可以了,注意人物头上只留名字,不要穿新披风及带高帽子

可做料理茶台需放统一地方,即庭院回家方向右边门口,卡住自动断线重登!
注意,身上只能带一种月饼,如果之前有剩下的请先将其用完!或在城里按 CTRL+A再按END后全部丢弃!


另注意窗口不能最小化,后台模可把窗口拖到屏幕外,可隐藏

阅读全文...

挂羊设置教程

挂羊设置教程

1.jpg

4.jpg

3.jpg

5.jpg


阅读全文...

有关蓝屏处理办法

有关蓝屏处理办法

请您核对下您的系统今天是否更新过补丁,若更新过补丁kb2883150,将补丁卸载后重启电脑后尝试

XP卸载方法:打开开始菜单-控制面板-添加删除程序

image001.jpg

win7卸载方法:打开开始菜单-控制面板-程序和功能-查看已安装的更新

image003.jpg

找到相应编号的补丁,选中该补丁,然后点击上方的卸载,将补丁卸载,卸载完重启电脑
若卸载补丁后仍不能正常使用,建议直接联系我们的

在线客服说明您的详细使用情况以便我们的客服人员能够及时的为您解决问题!
感谢您一直以来支持与配合!祝您游戏愉快!

 

阅读全文...

视频教程

视频教程

由于软件更新较快,此教程为参考教程,具体以新软件为准

 

 

阅读全文...

软件试用码

软件试用码

CUFCSWRDVFVJCCBWIITWWFEHFFFTFFEE

          可试用3次,每次30分钟

阅读全文...

全自动窗口化工具

全自动窗口化工具

3.jpg

下载解压后直接运行一键设置工具即可


点击下载此软件

阅读全文...

解决游戏窗口化花屏

解决游戏窗口化花屏

游戏窗口化花屏的请下载此工具

 

点击下载此工具

阅读全文...

HMAC顶级加密方法

HMAC顶级加密方法

HMAC顶级加密方法

HMAC 算法主要应用于身份验证,用法如下:


1.客户端发出登录请求
2.
服务器返回一个随机值,在会话记录中保存这个随机值
3.
客户端将该随机值作为密钥,用户密码进行 hmac 运算,递交给服务器
4.
服务器读取数据库中的用户密码,利用密钥做和客户端一样的 hmac运算,然后与用户发送的结果比较,如果一致,则用户身份合法。


这么做有什么好处呢? 如果我们在登录的过程中,黑客截获了我们发送的数据,他也只能得到 hmac 加密过后的结果,由于不知道密钥,根本不可能获取到用户密码,从而保证了安全性。


HMAC 的种类 
算法种类 摘要长度 
HmacMD5 128 
HmacSHA1 160 
HmacSHA256 256 
HmacSHA384 384 
HmacSHA512 512 
HMAC 的使用 

1 . 刚才也看到了,想要使用 HMAC 算法,那么我们需要生成一个密钥,这个密钥怎么生成呢?自己随便瞎填吗? JDK 中自带了一个密钥生成器 KeyGenerator 用于帮助我们生成密钥,示例如下


public static byte[] getSecretKey() throws Exception { 
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); // 可填入 HmacSHA1,HmacSHA256  
SecretKey key = keyGenerator.generateKey(); 
byte[] keyBytes = key.getEncoded(); 
return keyBytes; 

2 . 既然已经得到了密钥,那么下面就开始执行消息摘要算法,在这之前,由于我们生成的密钥是以 byte 数组返回的,所以我们需要将其还原成 SecretKey,具体过程如下


public static String encryptHmac(byte[] key, byte[] data) throws Exception { 
SecretKey secretKey = new SecretKeySpec(key, "HmacMD5"); 
Mac mac = Mac.getInstance("HmacMD5"); 
mac.init(secretKey); 
byte[] resultBytes = mac.doFinal(data); 
String resultString = byteToHexString(resultBytes); 
return resultString; 

如果想使用其他的算法,可以将填入 HmacMD5 的所有字段改为你想使用的算法即可,比如 HmacSHA1, HmacSHA256 等。


下面对 helloworld 执行算法查看结果


1efd5e8d4d0c20f68bdc732fd7a79677

阅读全文...

http超时设置 golang

http超时设置 golang
Go网络编程基础
超时设置
HTTP client/server
TCP client/server
KeepAlive
TCP KeepAlive
HTTP KeepAlive
调试方法


Go网络编程基础
Socker编程:如下图所示

go socket编程


HTTP编程:

Client示例如下:


transport := &http.Transport{ 
Dial: (&net.Dialer{ 
Timeout: 10 * time.Second, 
}).Dial, 
MaxIdleConns: 2, 

client := &http.Client{ 
Timeout: time.Second * 30, 
Transport: transport, 

resp, _:= client.Get("http://localhost:8888/hello") 
body, _ := ioutil.ReadAll(resp.Body) 
resp.Body.Close() 
Server示例如下

http.HandleFunc("/hello", func(w http.ResponseWriter, req *http.Request){
        fmt.Printf("receive msg form: %v", req.RemoteAddr)
        _, _ := io.WriteString(w, "hello world!\n")               
})
server := &http.Server{Addr: ":8888"}
_ := server.ListenAndServe()
2. 超时设置

首先介绍HTTP超时设置,Server端,主要关注四个参数:ReadTimeout、ReadHeaderTimeout、WriteTimeout、TimeoutHandler,代码示例如下

type EchoHandler struct {}

func (handler *EchoHandler)ServeHTTP(w http.ResponseWriter, req *http.Request) {
n, _ := io.WriteString(w, "echo !\n")
}

func main() {
timeoutHandler := http.TimeoutHandler(&EchoHandler{}, 5 * time.Second, "echo timed out!")
http.Handle("/echo", timeoutHandler)
listener, _ := net.Listen("tcp", ":8888")
server := &http.Server{
ReadTimeout: time.Second * 5,
WriteTimeout: time.Second * 10,
ReadHeaderTimeout: time.Second * 3,
}
_  := server.Serve(listener)
}
下面一张图形象地显示了HTTP在服务端的参数设置,来源:the complete guide to golang net http timeouts。

HTTP服务端超时设置
我们举一个TimeoutHandler参数的例子,这个参数是指从读取request body到返回Response的时间(即处理请求的时间),我们设置超时时间为5秒,并在函数处理时Sleep 1分钟,抓包观察连接变化。代码如下:

func (handler *EchoHandler)ServeHTTP(w http.ResponseWriter, req *http.Request) {
time.Sleep(time.Second * 60)   
n, _ := io.WriteString(w, "echo ! \n")
}
timeoutHandler := http.TimeoutHandler(&EchoHandler{}, 5 * time.Second, "echo timed out!")
使用tcpdump结合wireshark抓包分析如下:

TimeoutHandler超时
可见,在读取Request body 5秒之后,(第18秒到23秒),服务端向客户端发送了statuscode为503(服务不可用)的报文,客户端收到的信息如下:

err: nil
  statuscode: 503
  body: "echo timed out!"


HTTP client端设置超时代码片段如下:

transport := &http.Transport{
Dial: (&net.Dialer{
Timeout: 10 * time.Second,
}).Dial,
IdleConnTimeout:     10 * time.Second,
TLSHandshakeTimeout:   5 * time.Second,
ResponseHeaderTimeout: 10 * time.Second,
}

client := &http.Client{
Timeout:   30 * time.Second,
Transport: transport,
}
下面图片显示了各个参数起作用的时间。

HTTP client设置
我们看一下Dialer.Timeout,这个参数限制TCP建立连接的时间,在TCP建立连接时,主动发起请求的一方发送syn报文,如果syn报文没有得到回应,就会对这个syn报文进行重传。在linux中,会对syn报文进行6次重传,第i次重传之后等待2^(i-1)秒,共计等待127秒作用(这个只是一个估计值,不是绝对的)。linux与此相关的两个参数为:

net.ipv4.tcp_syn_retries     默认为6
net.ipv4.tcp_synack_retries  默认为5,即对synack报文进行5次重传
下面几个是对连接进行抓包的示例,分别对不同情况下的报文进行抓包分析。

示例一:一次正常的HTTP请求流程

一次正常的HTTP请求过程


从报文中可以看到,首先是TCP三次握手的过程 ,然后主动发起连接的一方发送了一个create volume的请求,server对此请求进行了回应(发送了一个ack),此后的时间,链路进入idle状态(双方都没有等待ACK),在这段时间内,服务器在处理请求,请求处理完成之后,向客户端发送数据

示例二:Server在处理请求过程中宕机。

如果未为客户端设置超时或者KeepAlive, 如果服务端在处理请求的时候宕机(此时链路处于idle状态),那么这个连接在客户端将一直保持,如果不进行处理这个无效的连接将一直占用文件描述符(可能会导致无法建立新连接或者打开文件),用netstat命令查看连接状态如下,

连接一直保持
示例三:Server未宕机,Client处理请求超时

这种情况下,为客户端设置了超时时间(http.Client.Timeout=600s),那么客户端在超时时间到达时发送fin报文给服务端,服务端对这个fin报文进行回应,但是因为服务端还没处理完,服务端并不会发送fin报文,此时客户端直接从fin_wait2状态到close状态。linux中控制fin_wait2时间的变量为net.ipv4.tcp_fin_time,默认为60秒,抓包分析如下:

Client超时
示例四,Server宕机、Client超时

在这种情况下,client会发送fin报文给server,跟示例三一样,但是server并不会对这个fin进行回应,因为它宕机了,这个时候client会对这个fin报文进行重传,重传到一定次数就断开连接,linux控制重传的参数为: tcp_retries1, tcp_retries2,默认情况下,普通报文重传16左右(整个过程持续14分钟)fin报文的重传次数我不确定,持续时间差不多。重传等待时间是上次等待时间的两倍。

fin报文重传
TCP超时设置

TCP超时设置比较简单,主要是三个参数,这三个方法每次读写前都需要重置一下,因为是设置绝对时间。

Conn.SetDeadline(t time.Time)      
Conn.SetReadDeadline(t time.Time) 
Conn.SetWriteDeadline(t time.Time)
示例代码如下,参考 Tcp timeout example

bufReader := bufio.NewReader(conn)
timeoutDuration := 5 * time.Second

for {
// Set a deadline for reading. Read operation will fail if no data is received after deadline.
conn.SetReadDeadline(time.Now().Add(timeoutDuration))

bytes, err := bufReader.ReadBytes('\n')
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s", bytes)
}


3. KeepAlive介绍

首先介绍TCP keepAlive,TCP的keepAlive作用如下

判断连接是否断开(由中间设备、对端故障引起)
为连接保持数据流
KeepAlive在linux中有三个参数,分别表示开始发送探测报文之前的等待时间,发送探测报文的间隔,以及发送探测报文的此时。

net.ipv4.tcp_keepalive_time
    net.ipv4.tcp_keepalive_intvl
    net.ipv4.tcp_keepalive_probes
查看修改配置方法的方法为:

查看 sysctl -a | grep tcp_keepalive

修改配置文件/etc/sysctl.conf,执行sysctl -p生效

关于TCP keepAlive可以参考TCP Keepalive HOWTO,下面是TCP keepalive的示例




Golang TCP KeepAlive的设置很简单,在Socket情况下,仅需要设置两个参数:

TCPConn.SetKeepAlive(true)
TCPConn.SetKeepAlivePeriod(3 * time.Minute)
在HTTP情况下设置分为Client和Server,Client设置如下:

netTransport := &http.Transport{
Dial: (&net.Dialer{
KeepAlive: 3 * time.Minute,
}).Dial,
}
Server设置如下:

Server.ListenAndServe()             // enable    
Server.ListenAndServeTLS()        // enable
Server.Serve()                              // disable
Golang的实现为,probes使用linux系统的默认值,intvl的值与time值相等,为参数设置的值,关于golang tcp keepalive可以参考Using TCP keepalive with Go

再介绍HTTP KeepAlive,HTTP keepAlive是一种连接复用技术,意在减少连接建立和关闭所消耗的时间。

Golang HTTP keepalive设置如下,client:



http.Transport{ 
DisableKeepAlives: false, 
MaxIdleConnsPerHost: 2, // Per proxy, scheme, addr 
MaxIdleConns: 2, 
IdleConnTimeout: 10 * time.Second, 

Server:

Server.SetKeepAlivesEnabled(true)    // Server disable + Client enable = disable


4. 问题调试方法

netstat 命令

netstat no | grep 8808

-o: 查看状态与计时器

tcpdump 命令

tcpdump -i enp0s31f6 host 172.16.3.113 -w tcpdump.cap

wireshark 软件

使用过滤条件

tcp.port == 8808

ip.addr == 172.16.3.11

阅读全文...

Golang和php通信

Golang和php通信
不同语言之间的通信方式有很多种,这里我介绍一种最简单通信方式,json-rpc。
Golang自带json-rpc包,使用起来十分简单,示例如下,提供一个简单echo server。
```golang
package main
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type Serve struct {
}
func (s *Serve) Echo(a *int, r *int) error {
*r = 1
return nil
}
func main() {
tcpAddr, err := net.ResolveTCPAddr("tcp", ":9001");
if err != nil {
fmt.Println(err)
return
}
l, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
fmt.Println(err)
return
}
serve := &Serve{}
rpc.Register(serve)
for {
conn, err := l.Accept()
if err != nil {
fmt.Println(err)
continue
}
go jsonrpc.ServeConn(conn)
}
}
```
php 客户端代码,示例如下。
```php
$conn = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$conn) {
return FALSE;
}
socket_set_option($conn, SOL_SOCKET, SO_SNDTIMEO, array(
"sec" => 0,
"usec" => 50000
));
$result = socket_connect($conn, '127.0.0.1', 9001);
$s = time();
$w = ['id' => time(), 'params' => [1], 'method' => 'Serve.Echo'];
socket_write($conn, json_encode($w));
$r = socket_read($conn, 1024);
socket_close($conn);
echo $r;
```
就这样。

阅读全文...