【问题标题】:How to find IP:Port of incoming client in TCP Connection如何在 TCP 连接中查找 IP:传入客户端的端口
【发布时间】:2015-03-14 07:50:05
【问题描述】:

收到conn, err := listener.Accept()的连接后,想在conn的另一端找到客户端的地址。我试过用conn.LocalAddr()conn.RemoteAddr() (Documentation) 来做这件事。 .LocalAddr() 只是给出了服务器进程的地址。 .RemoteAddr() 为客户端提供了正确的 IP,但端口号与我知道要绑定到的客户端的端口号完全不同。 如果它有任何区别,我会在同一台机器上运行两个单独的进程。一个是客户端,一个是服务器。关于如何找到正确的 IP:客户端端口的任何想法?我应该使用LocalAddr 还是RemoteAddr

【问题讨论】:

  • 为什么你认为RemoteAddr 端口是错误的?很少使用已定义的本地端口发起连接。

标签: sockets tcp go ip server


【解决方案1】:

在 OSX 上,使用 go 1.4 时,conn.RemoteAddr() 报告的主机/端口组合与 netstat 输出相比是正确的。

package main

import (
  "fmt"
  "net"
  "time"
)

func main() {
  ln, err := net.Listen("tcp", ":8080")
  if err != nil {
    panic(err)
  }
  for {
    conn, err := ln.Accept()
    if err != nil {
      panic(err)
    }
    fmt.Println(conn.RemoteAddr())
    time.Sleep(time.Minute)
    conn.Close()
  }
}

$ go run foo.go
127.0.0.1:63418

$ netstat -an | grep 8080
tcp4       0      0  127.0.0.1.8080         127.0.0.1.63418        ESTABLISHED
tcp4       0      0  127.0.0.1.63418        127.0.0.1.8080         ESTABLISHED

【讨论】:

  • 这真的很有帮助,非常感谢!我想我没有想到,仅仅因为我的客户端绑定到特定端口并不意味着它将通过同一个端口进行传出连接。
【解决方案2】:

netstat -a 1 -f 在 windows shell 中。我是一个命令行人,这可行,通过重定向将其写入文件。这将每秒重新运行一次,f 是解析 DNS 名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2018-12-30
    • 2020-12-17
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多