2016-09-11 76 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調用來接受。 –