```
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()前面的那条日志输出了,但是后面那条没记录,然后这条协程就不工作了。
现在不确定是阻塞住了,还是协程结束了;如果是协程结束了还好,我可以定时检测一下,如果挂了,就重新开一个协程;但是如果是阻塞了,重新开协程会导致协程泄露
大家谁遇到过这种情况,给解答一下,或者提供一下思路.
有疑问加站长微信联系(非本文作者)