go - 如果客户端在10秒内没有响应,如何通过超时关闭连接?

标签 go smpp

我有代码(我使用https://github.com/fiorix/go-smpp):

// -----------------------------------------------
// handleConnection new clients.
// -----------------------------------------------
func (_srv *ServerSmpp) handleConnection(_cfg *ConfigSmpp, c *conn) {
    defer c.Close()

    if err := _srv.auth(_cfg, c); err != nil {
        if err != io.EOF {
            log.Printf("smpp_server: server auth failed: %s\n", err)
        }
        return
    }

    notify := make(chan error)

    go func() {
        for {
            pb, err := c.Read()
            if err != nil {
                notify <- err
                return
            }

            err = _srv.Handler(_srv.RemoteProvider, c, pb)
            if err != nil {
                fmt.Printf("%s\n", err)
                notify <- err
                return
            }
        }
    }()


    for {
        select {
        case err:= <-notify:
            if io.EOF == err {
                fmt.Printf("Smpp server (read): %s\n", err)
                return
            }
      case <-time.After(time.Second * 10):
            fmt.Printf("Client disconnected by timeout.\n")
            return
        }
    }
}
调用的handleConnection的代码:
func (_srv *ServerSmpp) Serve(_cfg *ConfigSmpp) {
    for {
        client, err := _srv.NetListener.Accept()
        if err != nil {
            break 
        }
        c := newConn(client)

        go _srv.handleConnection(_cfg, c)
    }
}
当此代码正常工作时,服务器将在10秒钟内超时断开所有客户端的连接,但是在10秒钟不工作时如何断开客户端的连接?

最佳答案

您的client对象似乎是net.Conn
选择一种在阻塞client.SetReadDeadline()之前调用具有适当time.Time值的client.Read()的方法:

c.client.SetDeadline( time.Now().Add(10 * time.Second )
pb, err := c.Read() { ...

关于go - 如果客户端在10秒内没有响应,如何通过超时关闭连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65380143/

相关文章:

java - 如何读取SMPP UDH消息

java - SMPP GENERIC_nack :message Invalid opensmpp Logica

php - Onlinecity SMPP - 添加新的 tlv 参数

java - SMPP模拟器和SMPP服务器之间的区别

input - fmt.Scanln 预期换行错误

go - 在 GO 中解析时间时出现奇怪的错误消息

java - SMPP 服务器 CloudHopper - 我应该如何接收多部分消息?

http - 为什么 http.ResponseWriter 不实现响应流 End() 调用?

go - Go 语言中 getter 和 setter 的接口(interface)

amazon-web-services - 尝试使用 golang 在 cloudwatch 上 PutLogEvents 时获取 SerializationException