【发布时间】:2010-09-25 17:55:51
【问题描述】:
我创建了一个 TCP 套接字,而不用担心绑定到 [socket.sin_port = 0] 的端口号。但是稍后如果我想打印客户端的端口号,我该怎么做?客户端 C 应用程序(在 Linux 上)创建许多连接到服务器的客户端。为了调试问题,我捕获了 ethereal 上的流量。我想在出现问题时在日志中打印端口号,以便在 ethereal 上进行过滤变得容易。
任何帮助将不胜感激。
-帕布
【问题讨论】:
我创建了一个 TCP 套接字,而不用担心绑定到 [socket.sin_port = 0] 的端口号。但是稍后如果我想打印客户端的端口号,我该怎么做?客户端 C 应用程序(在 Linux 上)创建许多连接到服务器的客户端。为了调试问题,我捕获了 ethereal 上的流量。我想在出现问题时在日志中打印端口号,以便在 ethereal 上进行过滤变得容易。
任何帮助将不胜感激。
-帕布
【问题讨论】:
连接成功后使用getsockname()调用获取socket地址和端口。
编辑:正确的方法名称。有时我无法将一个简单的单词从一个窗口复制到另一个窗口!
【讨论】:
我相信 Darron 的意思是 getsockname()。如果您需要以编程方式确定客户端(调用connect() 的一侧)的端口号,这就是您想要的。在服务器端(调用bind() 的端),您将使用getpeername() 从连接的套接字获取相同的信息。
但是,如果您正在调试并且无法更改代码,那么您最终会使用 netstat 或 sockstat 实用程序等工具,具体取决于操作系统。我不确定 Linux(甚至您的特定软件包)下有哪些实用程序可用,但我会从 man sockstat 开始。如果已安装,您可以从任一侧运行它并查看哪些端点已分配给哪些进程。将其与grep 结合使用,您通常可以找出在 Ethereal 中要过滤的地址。祝你好运!
【讨论】:
lsof -p <process id> | grep TCP
【讨论】: