簡體   English   中英

如何在Linux內核中注冊UDP端口並為此端口范圍創建鈎子

[英]How to register UDP ports in Linux Kernel and creating hook for this port range

我是Linux內核的新手。 我正在編寫內核模塊,該模塊處理多個UDP語音流。 對於此模塊,我想在內核中注冊具有不同語音流的多個UDP端口,以便其他UDP通信無法使用這些UDP端口。 根據我的理解,創建套接字和綁定是一種方法。

我還想為這些UDP語音端口創建一個掛鈎函數,以便每當收到語音數據包時,它將調用我的掛鈎函數。

我有幾個問題:

  • 除了創建套接字並綁定它以外,還有什么更好的方法可以在Linux內核中注冊多個UDP端口?
  • 如何創建一個掛鈎函數,並為這些已注冊的多個UDP語音端口調用它?

簡短的答案是:如果您必須要問,那么您就不應該這樣做。

這是更長的版本:

TCP / IP編程是API使用它來適應用戶空間的領域之一。 結果是沒有簡單的方法可以從內核創建TCP / IP(包括UDP)套接字。

即使您進行了管理,也會發現自己不適合使用的API。 該代碼將在您使用時嘗試操縱用戶空間內存,用戶空間通知等。

有足夠經驗的內核開發人員可能會成功實現這一目標。 但是,必須去Stack Overflow才能上手的人可能經驗不足。

這使我們回到了最初的問題:您為什么仍要在內核中編寫這樣的代碼? IP語音是一個復雜的協議。 與調試用戶空間代碼相比,在內核中調試代碼要困難得多,更不用說在出錯時進行錯誤恢復了。

如果您編寫的代碼絕對必須具有高性能和低延遲,那么我建議您看一下基於純用戶空間的解決方案(即-根本沒有內核)。

這樣的解決方案就是DPDK 它使您可以將網絡數據包直接接收到用戶空間緩沖區中。 不幸的是,這也不是為初學者設計的解決方案。 由於不涉及內核,因此該接口必須專用於DPDK。 這也意味着您必須編寫自己的UDP堆棧來支持它。

DPDK不是簡單易用的工具,但是如果您必須具有絕對最高的帶寬和絕對最低的延遲,則它是最佳的解決方案。 可能比在內核中編寫整個VoIP堆棧更好。 如果那不是您所需要的,則只需使用普通的套接字編程工具即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM