2016-09-11 72 views
0

在Linux 3.9内核和更高版本中运行时,我有一个应用程序X,它在特定套接字上侦听连接。我想写一个不相关的应用程序Y,它跟踪连接到这个套接字的尝试次数,源IP等等。在无关进程之间共享套接字(监听)

是否有可能在C++中(理想情况下通过Qt库)共享/监视套接字由一个不相关的进程使用?我发现了几个StackOverflow问题,这些问题表明分叉分享套接字,但在这种情况下这是不可能的。

+1

你可以使用'tcpdump':http://superuser.com/questions/604998/monitor-tcp-traffic-on-specific-port –

+0

这样做的一种方法(即不依赖于任何特殊的OS-级别的能力)应该是让Y代表X接受连接,并充当X的代理(通过连接到X的端口并来回转发流量)。不过,Y需要接受不同端口上的连接。但是,如果你有能力这样做,直接用X来测试X可能会更容易一些。 –

回答

1

可以将文件描述符传输到另一个进程,其行为类似于跨进程dup(2)。详情请参阅Can I open a socket and pass it to another process in Linux。但是这需要明确地完成,即一个进程发送文件描述符,另一个进程接收它。因此这个“不相关”的过程必须合作。

但是监听套接字不能用于监视。套接字只能接受连接,但无法查看另一个进程是否在同一个套接字上接受连接,而不管套接字是否与fork,线程或文件描述符传递共享。

给定正确的权限和操作系统,您可以使用ptrace(2)或类似接口监视系统调用级别的应用程序的行为。在那里你可以看到应用程序是否使用accept和它返回的内容。或者像评论中提到的那样,您可以使用数据包捕获(tcpdump,原始套接字)来简单地观察流量并从成功的TCP握手中扣除某个(未知)进程必须接受连接。

+0

进程X由另一家公司编写 - 我无法访问其内部... – TSG

+0

@Telium:这会让您带有ptrace和数据包捕获。或者你可以尝试拦截libc调用来接受。 –