2012-06-29 44 views
4

我在網關上有一個網絡應用程序。它接收和發送數據包。對於其中的大多數,我的網關充當路由器,但在某些情況下,它也可以接收數據包。c linux多線程聯網

我應該有:

  • 只有一個主線程
  • 一個主線程+負責給它正確的流處理器
  • 儘可能多的線程調度線程,因爲有流動
  • 別的東西。

+2

如果你不想學習Unix網絡編程(如果它不是你的意圖並編寫自己的代碼),你可以使用一些庫的幫助。看看ENet(http://enet.bespin.org/)。您可以在這裏閱讀更多關於它的信息:http://www.linuxjournal.com/content/network-programming-enet(來自文本:這意味着您不必擔心分叉,預編譯,線程或非阻塞調用的複雜性連接()和接受()以處理多個連接。) –

回答

2

正確執行多線程並不是一件簡單的事情,在許多情況下,基於selectfriends的解決方案將更容易創建。

+0

'select'和'based based'?那些是什麼? – nullpotent

+0

@AljoshaBre請參閱編輯 – fvu

+0

這絕對是基於來自問題的輸入的方式。 –

1

我不知道很多關於物聯網應用,但我認爲是這樣的:

  • 如果你有反應異步你可能會只使用一個單獨的線程(如在節點的請求的能力.JS)。如果您無法反應異步,主線程將始終阻止其他操作。
  • 如果您無法對請求反應異步,則必須使用多個線程。但是你可以通過許多不同的方式來實現這一點:你可以爲每個請求創建一個線程或有限數量的線程,然後將它們分配給你的請求。
2

您的情況聽起來很像典型的Unix服務守護進程。解決問題的流行方法不是使用線程,而是使用分支。

這個想法是你的程序在套接字上偵聽並等待連接。一旦連接到達,它就會分叉。子進程然後繼續處理連接。父進程本身只是在循環中繼續並等待傳入​​連接。

優勢在穿線:

  • 非常簡單的程序設計
  • 沒有併發問題
  • 的Unix/Linux系統建立的方法

缺點:

  • 事情變得複雜,當幾個連接彼此交互(你的使用情況聽起來並不像他們會)
  • 性能損失在Windows系統上(而不是在Unix系統!)

你可以找到許多代碼示例在線。

+0

+1,但如果不同的連接夥伴需要交換信息,分叉將成爲問題,因爲開放套接字將存在於不同的進程中。 – fvu

+0

是的,我只是將其添加到答案中。 :) – ypnos

0

我的個人偏好是每個連接使用一個主線程和一個工作線程。沒有任何帽子。我假設你的服務器像HTTP服務器一樣是無狀態的。

對於有狀態的服務器,你將不得不找出一些方法來控制線程數量。