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

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

關于套接字的 SO_REUSEADDR 不能在 golang 中正常工作嗎?

關于套接字的 SO_REUSEADDR 不能在 golang 中正常工作嗎?

Go
九州編程 2023-05-22 15:38:54
單個 IP 只能支持 65535 端口到單個目標。希望client在性能測試的時候能夠立即重用舊的tcp_session,即使session還處于time_wait狀態。在我的 Linux 機器上,我打開了這些開關sysctl -w net.ipv4.tcp_timestamps=1sysctl -w net.ipv4.tcp_tw_recycle=1sysctl -w net.ipv4.tcp_tw_reuse=1然后我寫了下面的代碼來用golang驗證socket_reuse選項。在代碼中,我綁定了本地端口12345。先跑后$go run 1.go$netstat -nat | grep 12345tcp        0      0 192.168.1.11:12345         111.161.3.173:80            TIME_WAIT二次運行后$go run 1.goClient Connect() called error: cannot assign requested address似乎 SO_REUSEADDR 不能工作。任何人都可以幫助解決這個問題嗎?package mainimport (    "fmt"    . "syscall")func main() {    var (        clientsock int        serveraddr SockaddrInet4        err        error    )    if clientsock, err = Socket(AF_INET, SOCK_STREAM, IPPROTO_IP); err != nil {        fmt.Println("Client Socket() called error:", err.Error())        return    }    SetsockoptInt(clientsock, SOL_SOCKET, SO_REUSEADDR, 1)    defer Shutdown(clientsock, SHUT_RDWR)    serveraddr.Addr = [4]byte{111, 161, 3, 173}    serveraddr.Port = 80    err = Bind(clientsock, &SockaddrInet4{        Port: 12345,    })    if err = Connect(clientsock, &serveraddr); err != nil {        fmt.Println("Client Connect() called error:", err.Error())        return   }}
查看完整描述

1 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

您應該對代碼添加兩個更改:


1) 設置套接字選項 unix.SO_REUSEPORT。


if errReusePort := SetsockoptInt(clientsock, SOL_SOCKET, unix.SO_REUSEPORT, 1); errReusePort != nil {

    fmt.Printf("reuse port error: %v\n", errReusePort)

    return

}

2) 使您的代碼連接到不同的遠程 TCP 端點。否則,由于單一源地址/端口,TCP 將無法區分兩個相同的連接(協議、src-addr、src-port、dst-addr、dst-port)。下面的示例在命令行中指定了兩個遠程服務器地址。


$ go run main.go 127.0.0.1

connected


$ go run main.go 127.0.0.2

connected

在操場上找到完整的工作代碼:https ://play.golang.org/p/HYLkWlVH6T4


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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