2010-08-16 48 views
0

有沒有任何可行的替代Winsock for C++?我需要的原因是因爲Winsock的原始套接字不能正常工作(不,這不能解決,不要浪費你的時間)並且WinPCAP只能監視網絡流量,而不能實際接收數據包。我需要一些可以接收完整數據包的東西,包括任何IP,UDP,TCP標頭等。是否存在這樣的事情,如果不存在,爲什麼不呢?Winsock的替代(不,不WinPCAP)

+9

我要浪費我的時間問:爲什麼它不爲你工作?如果你要聲稱[適用於其他人的產品]不起作用,那麼你應該至少花一兩句話來支持它。 – Thanatos 2010-08-16 02:32:51

+0

解釋時間太長,會導致更多問題。 – Chroma 2010-08-16 02:39:27

+1

你是對的 - 它通常導致更多的問題,並且大多數時候(特別是當OP沒有解釋他們的情況時),這導致我們發現他們沒有正確使用[適用於其他人的產品]。例如,幾乎每個「我認爲我在GCC中發現了一個錯誤」帖子。因此,我問時間浪費的問題。 – Thanatos 2010-08-16 02:43:25

回答

1

你可以看看Boost.Asio。 C++跨平臺IO庫。支持UDP,TCP和ICMP。

+0

這樣你就可以收到整個數據包,包括所有標題和所有內容? – Chroma 2010-08-16 02:25:11

+0

Boost.Asio封裝了BSD套接字庫。看到Winsock可以做到這一點(Winsock也是基於BSD套接字),那麼Asio就可以做到這一點。 basic_socket類包裝'ioctl'函數。 – Anthony 2010-08-16 02:37:25

+0

是的,boost可以保證你收到整個數據包。看看http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/async_read.html – Default 2010-08-23 09:23:48

6

WinPcap的只能監控網絡流量,沒有實際接收數據包

監控網絡流量相當於接收數據包。這正是Wireshark所做的工具:讀取網卡並重建數據包邊界。

這是非常有可能使用Winsock API需要的東西,可以得到完整的數據包,包括任何IP,UDP,TCP報頭,等等。看看WSAIoctl函數,特別是SIO_RCVALL選項 - 啓用該選項將在接口上接收的所有數據包傳遞到套接字。這些是以IP頭開始的原始IP數據包。

+0

沒有,監控流量不等於接收數據包,因爲當你監督,你只觀察談話的其他項目無法參與。我不想收到網絡上的所有數據包,我只想要那些我通常會得到的數據包,但我想要標題。 – Chroma 2010-08-16 02:41:39

+0

難道你不能寫一個函數,將所有的數據包縮小到你想要的數據包,並將這些數據傳遞給系統的其餘部分? – Thanatos 2010-08-16 02:46:36

+3

@Chroma:原始數據包本身不對應任何應用程序。這是頭文件中的端口號,它們將它們引導至正確的程序。所以你有兩種選擇:要麼得到所有的原始數據包,要麼自己過濾它們,要麼讓操作系統爲你做這件事並丟失頭文件。 – casablanca 2010-08-16 02:53:58