tls包的握手出现问题

jqf00007 · 2015-04-27 09:25:25 · 3148 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-04-27 09:25:25 的主题,其中的信息可能已经有所发展或是发生改变。

func connect_apns(procid int)(error, *tls.Conn){
   cert, err := tls.LoadX509KeyPair(certpath, keypath)
   if err != nil {
       fmt.Printf("error: %s ,procid:%d\n", err.Error(), procid)
       return err,nil
   }
   // 连接到 APNS 
   conn, err := net.Dial("tcp", "gateway.push.apple.com:2195")
   if err != nil {
      fmt.Printf("tcp error: %s\n", err.Error())
      return err,nil
   }
   conf := &tls.Config {InsecureSkipVerify: true,
        Certificates: []tls.Certificate{cert},
   }
   tlsconn := tls.Client(conn, conf)

   log.Info("ready to handshake procid:%d",procid)
   // 强制握手,以确认验证身份握手被处理
   err = tlsconn.Handshake()
   log.Info("complete handshake procid:%d",procid)


   if err != nil {
      tlsconn.Close()
      fmt.Printf("tls error: %s\n", err.Error())

      return err,nil
   }

   return nil,tlsconn
}

简介:这个函数是用来连接苹果推送服务器apns的; 调用情况:外层是个死循环,一旦io出现问题、读写超时或者io到达一定次数就调用该函数重连;

func push{
 for{
      connect_apns();
      for{
      //IO操作
      }
CLOSE:
    //关闭连接
}
}

现在我有多个push并发,每天一个push协程平均重连次数大概一千多; 但是这个程序运行2-3天后,就开始出现协程不工作的现象,加了调试信息,发现是在握手时候的问题:看日志的时候发现,tlsconn.Handshake()前面的那条日志输出了,但是后面那条没记录,然后这条协程就不工作了。 现在不确定是阻塞住了,还是协程结束了;如果是协程结束了还好,我可以定时检测一下,如果挂了,就重新开一个协程;但是如果是阻塞了,重新开协程会导致协程泄露

大家谁遇到过这种情况,给解答一下,或者提供一下思路.


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3148 次点击  
加入收藏 微博
2 回复  |  直到 2016-01-07 06:42:45
jqf00007
jqf00007 · #1 · 10年之前

大神们帮我看看啊

bopjiang
bopjiang · #2 · 9年之前

Handshake() 前连接设置读超时?

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传