2011-01-06 57 views
2

最近我開始研究一個程序,該程序將監視我的一個開源程序的數據包,以嘗試瞭解有關編程和網絡的更多信息。另外,我想爲程序添加額外的功能而無需編輯源代碼,就像外部控制面板一樣。 (我使用WPE Pro過濾數據包以防萬一你想知道,WireShark對於這樣一個簡單的任務來說太麻煩了。)有一件事讓我困擾,但是Socket ID。C#查找套接字ID?

我知道它是什麼,之前我已經問過一個關於它的問題,但我不知道如何使用它/分配一個/截取一個。

沒有正確的套接字ID,我的程序將無法做任何事情,所以我的問題是,如果有可能找出套接字ID套接字使用,一旦你捕獲數據包?

如果不是,還有其他方法嗎? - 或Visual Basic等其他語言?

謝謝你的時間。

+0

Duplicate http://stackoverflow.com/questions/2742763/how-to-get-socket-id-handle-descriptor-for-an-already-open-connection-net-c – dzendras 2011-01-06 13:56:52

+0

答案有錯,SharpPcap不能獲取套接字ID。如果我錯了,請以答案的形式糾正我,因爲這正是我要找的。 – Nick 2011-01-06 14:12:27

回答

4

如果通過插座ID,你的意思是一個成功的調用的返回值socket()功能,我不認爲有一種方式。

您可以獲得最接近的進程ID,因爲您可能已經知道,每個IP數據包都有一個由元組(IP地址,端口)描述的目的地,並且在系統內部只有一個套接字可以成功綁定到那個元組。像TCPView這樣的工具能夠將一個IP元組映射到一個進程,所以如果這個信息對於你來說足夠了,那麼方式確實存在

如果不是這種情況,我不知道任何方法來檢索您需要的套接字ID 如果目標應用程序不合作。

+0

首先,感謝您的回覆。使用WPE Pro過濾數據包時,每個數據包都具有相同的「套接字標識」以唯一標識連接。因此,如果我理解正確,那麼套接字ID有可能等於程序的進程ID,儘管它可以隨時間變化嗎?我希望程序的源代碼能幫助我,但是我找不到任何與創建套接字連接有關的任何東西。 – Nick 2011-01-11 08:15:29

0

socket()返回文件描述符,如果這是你指的是作爲一個插座ID那麼,什麼方式得到這個沒有進程的合作在Windows上是有限的。在Linux開放式FD上的FWIW被列舉在proc文件系統中。

這就是說,你可以用fd做的唯一事情就是從套接字發送附加信息。您也可以從fd中讀取數據,但以這種方式讀取的任何數據將被髮送到擁有該套接字的應用程序,而不是而不是。如果沒有一些協調,這可能不會成爲你想要的,因爲你只會得到一些數據。

如果只是希望能夠竊聽到在你的程序的流量,然後像包過濾應該是足夠的,所以我假設你真的想能像在中間它的人。

如果是這種情況,那麼最好的做法是將您的應用程序設置爲其他服務的代理。

我的意思是,寫打開一個監聽端口,並接受連接發起連接時,應立即打開自己的連接到一個預配置的IP的程序:端口組合,並開始轉發流量。一旦寫完,在轉發和可能修改之前檢查流量是一件簡單的事情。

如果你的程序是一個服務器,一個非標準端口上運行,配置此應用程序打開服務器的正常端口,然後轉發給你設置localhost上非標準端口的連接。

如果您的程序是客戶端,只需將攔截器應用程序指向服務器,然後在您的盒子上選擇一個隨機偵聽端口。然後將客戶端配置爲連接到此偵聽端口,就像它是服務器一樣。

這應該適用於任何事情。唯一需要注意的是,如果流量被加密,您將顯然無法檢查/修改它。這與將您的應用程序放置在NAT後面的效果相同。

1

此庫:SharpPcap承諾使用任何.NET語言(如C#和VB.NET(more info))捕獲,注入,分析和構建數據包。

它是由Wireshark使用的庫,它確實可以捕獲和分析。