亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

定義 TCP 套接字選項

定義 TCP 套接字選項

Go
jeck貓 2023-04-04 17:29:41
我正在嘗試編寫一個小的 http 下載程序包,它可以允許在創建時控制 tcp 套接字選項,而且我真的堅持定義套接字選項的可能性。據我所知,在net struct Dialer包中的 1.11 版本中添加了接口Control,它應該允許定義此類選項,但我找不到任何關于在我試圖實現的上下文中使用的有效示例。dialer := &net.Dialer{    Timeout:       5 * time.Second,    Deadline:      time.Time{},    LocalAddr:     nil,    DualStack:     false,    FallbackDelay: 0,    KeepAlive:     0,    Resolver:      nil,    Control: controlOnConnectionSetup,}// set clientclient := http.Client{    Transport:     &http.Transport{        Proxy: nil,        DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {            return dialer.DialContext(ctx, "tcp", addr)        },        Dial:                   nil,        DialTLS:                nil,        TLSClientConfig:        nil,        TLSHandshakeTimeout:    0,        DisableKeepAlives:      false,        DisableCompression:     false,        MaxIdleConns:           0,        MaxIdleConnsPerHost:    0,        MaxConnsPerHost:        0,        IdleConnTimeout:        0,        ResponseHeaderTimeout:  0,        ExpectContinueTimeout:  0,        TLSNextProto:           nil,        ProxyConnectHeader:     nil,        MaxResponseHeaderBytes: 0,    },    CheckRedirect: nil,    Jar:           nil,    Timeout:       3,}以及cotrol函數的代碼(它不起作用,它只是從我找不到任何提及fd變量的示例中復制的):func controlOnConnectionSetup(network string, address string, c syscall.RawConn) error {var operr errorfn := func(s uintptr) {    handle := syscall.Handle(fd)    operr = syscall.SetsockoptInt(handle, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)    if operr != nil {        return    }}if err := c.Control(fn); err != nil {    return err}if operr != nil {    return operr}return nil}如果有人能告訴我我做錯了什么或至少提供有關如何在 tcp 連接中控制套接字參數的示例,我將不勝感激。
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您應該將func(s uintptr)to更改為func(fd uintptr),例如:


func myControl(network, address string, c syscall.RawConn) error {

    return c.Control(func(fd uintptr) {

        // set the socket options

        err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_TTL, 66)

        if err != nil {

            log.Println("setsocketopt: ", err)

        }

    })

}


查看完整回答
反對 回復 2023-04-04
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號