Networking 保存程序的所有网络i/o

Networking 保存程序的所有网络i/o,networking,Networking,通常我使用tcpflow来调试网络I/o,但它似乎没有任何方法按进程进行过滤-因此我需要手动确定哪些文件来自正在调试的程序,哪些是完全无关的流量。通常两者都是http,所以端口过滤是不可能的,而通过远程主机名进行过滤只是有时可能 从理论上讲,这应该是可行的。进程ID可以与套接字相关联,至少在Linux上-/proc/net/tcp将套接字地址对与inode相关联,并且fstating/proc/*/fd/*按进程显示所有套接字inode(这就是netstat-p所使用的)-但它需要由流量捕获程序

通常我使用
tcpflow
来调试网络I/o,但它似乎没有任何方法按进程进行过滤-因此我需要手动确定哪些文件来自正在调试的程序,哪些是完全无关的流量。通常两者都是http,所以端口过滤是不可能的,而通过远程主机名进行过滤只是有时可能

从理论上讲,这应该是可行的。进程ID可以与套接字相关联,至少在Linux上-
/proc/net/tcp
将套接字地址对与inode相关联,并且
fstat
ing
/proc/*/fd/*
按进程显示所有套接字inode(这就是
netstat-p
所使用的)-但它需要由流量捕获程序实时完成,否则,这些数据就会全部消失,所以我不能在以后重新整理正确的文件。(otoh我不确定这在OSX上是否可行)

或者另一种可能是在程序启动时使用某种低级库注入,比如
LD_PRELOAD
,而不是外部监视器

在程序中查找每一个网络读写,并在其中添加日志代码,这是一个非常可怕的选择,尤其是因为许多实际的i/o都可以深入到第三方库中


有什么建议吗?跨平台的东西是完美的,但如果它与OSX或Linux一起工作,就足够了。

如果您是从特定的用户ID运行程序,您可以使用大多数主要防火墙(至少是netfilter/iptables,Linux中使用的防火墙)按用户标记流量,然后使用Wireshark保存

此外,如果您只想调试网络数据,请尝试使用:

strace -f -e trace=network -s 10000 ping 8.8.8.8

很抱歉,未满足多平台要求。Windows上其他程序的低级网络i/o处理对我来说似乎有点棘手。

这是一种黑客行为,但使用strace可能有助于缩小范围。您将看到每个读写操作,包括本地和网络。