golang:An operation on a socket could not be performed because the system lacked sufficient buffer s

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) //处理粘包解包
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值