0

3462

Go 语言使用 TCP keepalive

如果你写过某些 TCP socket 代码,你可能会疑问:如果网线被拨掉或者远程主机崩溃了我的TCP连接会怎样?

简短的答案是:一点影响都没有。这种情况下连接的结束远程主机是不会发送FIN数据包的,并且本地系统不能检测连接是否已中断。所以需要作为程序员的你来解决这种情况。

GO语言为你提供了解决这个问题的几种方法。首选的方法可能是 net.Conn 接口中的SetReadDeadline方法。假设你的连接在以一种特定的间隔来接收数据,你可以简单地把读取超时当作一个io.EOF错误并Close这个连接。很多现有的TCP协议都支持处理错误的这种方法,它们通过定义某种心跳机制或 service health 1,在端点间以特定间隔发送PING/PONG探测包来检测双方网络问题。另外,这种心跳机制也可能有助于代理服务器查看网络活动来决定连接的健康质量。

所以,如果你的协议支持心跳的话,或者你能够为自己的协议加入心跳的话,这个方案应该是解决网络掉线问题的首选。

但是,如果你对该协议没有控制权并且它也不支持心跳你该怎么办?

现在是时候该了解 TCP keepalive并在GO中使用它了。TCP keepalive定义于RFC 1122,但并不是TCP规范中的一部分。它可以在个别的连接中启用,但默认必需是关闭的。启用它会使网络栈在空闲了特定时间后(不能低于2小时)探测连接的连接状况。探测包不能包含数据2,并且一个探测包的回复的失败不能将连接看作已中断,因为探测包的传输是不可靠的。

……

乐果   发表于   2015 年 03 月 13 日 标签:golang 继续阅读

0

2580

golang对文件路径、文件打开、游标、读写等操作

// test
package main

import (
    "fmt"
    "os"
    "path/filepath"
    "strings"
)

func main() {

    fmt.Println(filepath.Base("asda/adgasdg/asdg.hm"))
    fmt.Println("Hello World!")
    fmt.Println(strings.Split("helloasdasdg", ""))
    f, _ := os.OpenFile("aaa.txt", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
    news := []byte("45")
    fmt.Println(string(news))
    old := make([]byte, 2)
    f.Seek(7, 0)
    f.Read(old)
    f.Seek(7, 0)
    f.Write(news)
    f.Seek(0, 2)
    f.Write(old)
    f.Close()
}

乐果   发表于   2015 年 03 月 13 日 标签:golang 继续阅读

0

2760

啪啪江湖正式上线

啪啪江湖—无运动不江湖,一款基于运动项目的线上约赛、线下比赛的社交应用,使用者可以通过啪啪江湖,在线寻找运动爱好者,并发送约赛消息,邀请对方到线下的球场来见面并进行比赛,也可自己发起比赛,等对方来约赛,一对一单挑,多对多团战,比赛你来做主,规则你来定义,比赛结束后打开啪啪江湖应用,并提交比分,产生相应的积分和新的排名,即可分享自己的排行榜到各大社交平台展示。

让运动“更好玩”,认识更多的运动爱好者,引领生活新风尚。

啪啪江湖应用是由深圳市啪啪运动文化传播有限公司开发,于2015年3月6号正式上线。

乐果   发表于   2015 年 03 月 11 日 标签:papa啪啪运动 继续阅读

0

17014

ubuntu编译安装PostgreSQL(安装实例)

第一步,编译安装:

sudo ./configure --prefix=/opt/service/pgsql

报错:

configure: error: readline library not found

解决办法:

sudo apt-get install libreadline-gplv2-dev

报错:

configure: error: zlib library not found

解决办法:

sudo apt-get install zlib1g-dev

编译:

sudo make

报错:

make: command not found

解决办法

sudo apt-get install build-essential

……

乐果   发表于   2015 年 03 月 03 日 标签:postgresqlubuntu 继续阅读

0

13129

nginx配置文件中的location

location

语法:location [=|~|~*|^~] /uri/ { … } 默认:否

上下文:server

这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。

确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。

有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。

第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有一个 URL 链接’/images/%20/test’ , 那么使用 “images/ /test” 限定location。

总结,指令按下列顺序被接受: 1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索。 2. 剩下的常规字符串,长的在前。如果这个匹配使用 ^~ 前缀,搜索停止。 3. 正则表达式,按配置文件里的顺序。 4. 如果第三步产生匹配,则使用这个结果。否则使用第二步的匹配结果。

例子:

location = / {
# 只匹配 / 查询。
[ configuration A ]
}
location / {
# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}

location ^~ /images/ {
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。
[ configuration D ]
}

例子请求:

/ -> configuration A
/documents/document.html -> configuration B
/images/1.gif -> configuration C
/documents/1.jpg -> configuration D

注意:按任意顺序定义这4个配置结果将仍然一样。

(location =) > (location 完整路径 ) >(location ^~ 路径) >(location ~*, ~ 正则) >(location 部分起始路径) 正则表达式根据配置文件中的前后顺序影响匹配, 前面的优先匹配. 其它则根据匹配长度来优先匹配.

参考: http://wiki.nginx.org/NginxHttpCoreModule#location

乐果   发表于   2015 年 02 月 27 日 标签:nginx 继续阅读

较旧的文章 较新的文章
热评文章