1、问题
conn, err := net.Dial(“tcp”, ‘127.0.0.1:50001’)
执行此语句报错详细报错信息
dial tcp 127.0.0.1:50001: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
此报错的原因一般是系统端口已用尽,无法再建立新的Socket连接
2、分析
命令行查看端口的使用情况,查看分析那个程序存在假死的端口占用。
netstat -ano >D:\1.txt
查看1.txt
活动连接
协议 本地地址 外部地址 状态 PID
TCP 192.168.2.19:60005 192.168.2.18:20742 CLOSE_WAIT 5128
TCP 192.168.2.19:60005 192.168.2.18:29758 CLOSE_WAIT 5128
TCP 192.168.2.19:60005 192.168.2.18:29759 CLOSE_WAIT 5128
TCP 192.168.2.19:60005 192.168.2.18:29760 CLOSE_WAIT 5128
一般情况下可能存在大量CLOSE_WAIT 或者TIME_WAIT 导致的
详细处理方法详见 【服务器 TIME_WAIT和CLOSE_WAIT】 http://blog.csdn.net/xia_xing/article/details/53352486
3、查看结果发现 存在很多CLOSE_WAIT状态的SOKET
服务端代码如下:
func handleConn(c net.Conn) {
//Mark1
for {
rw := bufio.NewReader(c)
Receivebag := make([]byte, 4*1024) //数据包接收区
k, err := rw.Read(Receivebag)
if k == 0 || err != nil {
return
}
v, ok := buffermap[c] //判断缓冲区map中存不存在此连接
if ok { //存在
v = append(v, Receivebag[0:k]...)
buffermap[c] = v
} else {
buffermap[c] = Receivebag[0:k] //这是此连接的第一个数据包
}
Receivebag = nil
handleStickpackage(c) //处理粘包解包
}
}
正常建立连接不会存在问题,若是大量的连接频繁建立重建,连接可能存在无法正常关闭的情况,从而导致大量的CLOSE_WAIT连接,占用无法释放导致无法创建新的连接。
处理方法:
在//Mark1处增加socket的close,问题解决。
func handleConn(c net.Conn) {
defer c.Close() //关闭连接//Mark1
for {
rw := bufio.NewReader(c)
Receivebag := make([]byte, 4*1024) //数据包接收区
k, err := rw.Read(Receivebag)
if k == 0 || err != nil {
return
}
v, ok := buffermap[c] //判断缓冲区map中存不存在此连接
if ok { //存在
v = append(v, Receivebag[0:k]...)
buffermap[c] = v
} else {
buffermap[c] = Receivebag[0:k] //这是此连接的第一个数据包
}
Receivebag = nil
handleStickpackage(c) //处理粘包解包
}
}