How to find IP:Port of incoming client in TCP Connection

huangapple go评论71阅读模式
英文:

How to find IP:Port of incoming client in TCP Connection

问题

在接收到conn, err := listener.Accept()的连接后,我想要找到连接的另一端客户端的地址。我尝试使用conn.LocalAddr()conn.RemoteAddr()来实现这个目的(文档)。.LocalAddr()只会返回服务器进程的地址,而.RemoteAddr()会返回客户端的IP地址,但端口号与我所知道的客户端绑定的端口号非常不同。
如果有任何区别的话,我正在使用在同一台机器上运行的两个独立进程。一个是客户端,一个是服务器。有没有其他方法可以找到客户端的正确IP:端口?我应该使用LocalAddr还是RemoteAddr

英文:

After receiving a connection from conn, err := listener.Accept(), I want to find the address of the client at the other end of the conn. I've tried doing this with conn.LocalAddr() and conn.RemoteAddr() (Documentation). .LocalAddr() just gives the address of the server's process. .RemoteAddr() gives the right IP for the client but a very different port number from what I know the client to be binded to.
If it makes any difference, Im doing this with two separate processes running on the same machine. One is a client, one is a server. Any ideas as to how else I can find the correct IP:Port of the client? Am I to use either LocalAddr or RemoteAddr?

答案1

得分: 7

在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
英文:

On OSX, using go 1.4 the host / port combo reported by conn.RemoteAddr() is correct when compared against netstat output.

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

得分: -4

netstat -a 1 -f 是在Windows命令行中的命令。我是一个命令行的人,这个命令可以工作,通过重定向将结果写入文件。这个命令每秒重新运行一次,-f 参数用于解析DNS名称。

英文:

netstat -a 1 -f in the windows shell. I'm a command line guy, this works, write it to a file via redirect. This will rerun every second, the f is to resolve DNS name.

huangapple
  • 本文由 发表于 2015年1月16日 03:35:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/27971568.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定