2010-10-13 23 views
1

我有一個用C寫的dll。 我想發送數據到套接字並在相同的功能接收答案。
例如: -我可以發送到套接字並從它在同一個地方接收它在C

BOOL SendToSocketAndRecv(...) 
{ 
    // ... 
    send(...); 
    retval = recv(...); 
    // ... 
} 

在另一個詞,我的DLL不應該按照客戶端服務器pattren。

這可能嗎?
有幫助嗎?
謝謝 - Khayralla

+2

你試過了嗎? – 2010-10-13 16:32:49

+0

是的,這是可能的。 – adamk 2010-10-13 16:33:52

+0

我不會說這不符合「遵循客戶端 - 服務器模式」:大多數客戶端/服務器操作涉及發送和接收。例如,一個HTTP客戶端發送一條請求,說「取我這個URL」,並接收一些數據作爲響應。 – 2010-10-13 16:40:33

回答

0

我發送命令的機器人,然後迫不及待地想回答

是的,你有什麼工作。

但是,如果考慮到機器人無論如何都不會迴應的可能性,事情就會開始變得有趣。然後,您需要提供響應超時。很快,其他事情就會開始蔓延。例如,您可能不希望在等待期間陷入閱讀,因爲您可能需要在進入時處理其他事件(用戶輸入或其他來源)。

處理此問題的常見體系結構是使用select()並將其作爲所有傳入事件的中心。然後你驅動一個或多個狀態機關閉這些事件。你最終得到一個事件驅動的體系結構。它看起來像這樣:

while(true) 
{ 
    select(fds for event sources, timeout); 

    if (timeout) 
    { 
     call robot state machine(timeout); 
     continue; 
    } 

    iterate through fds 
    { 
     if (fd has data) 
     { 
      read data into buf 

      if (fd is for robot) 
      { 
       call robot state machine(buf) 
      } 
      else if (fd is for source1) 
      { 
       call source1 state machine(buf) 
      } 
      ... 
     } 
    } 
} 

在這個模型中,發送可以在代碼中的任何地方完成。但是,你在之後坐在select()中,等待事件發生。此外,你將不得不弄清楚做正確的超時和一般選擇的細節,但有足夠的那裏。

+0

謝謝Ziffusion,這是一個很好的幫助。 – Khayralla 2010-10-13 18:17:39

0

是的這是可能的和合法的。 API本身並不關心從同一個函數中使用。

+0

任何其他注意事項? – Khayralla 2010-10-13 16:45:54

1
  1. 您可以以阻斷(同步)或非阻塞(異步)模式下工作。根據這一點,你可能會或可能不會發送更多的數據,然後再從對等端收到一些信息。
  2. 「流」套接字(如TCP)是「隧道」。如果對方發送了幾個數據包,您可能會在recv的單個調用中接收到這些數據包,反之亦然 - 來自對等方的單音「消息」可能需要多次調用recv。因此,你應該在循環中讀取消息。
  3. 您對網絡編程有很多瞭解。
+0

有沒有任何網站解釋這個情景?根據第三點 – Khayralla 2010-10-13 17:02:58

+0

,如果我使用循環讀取所有消息,那麼這不會是發送和接收的基礎?並可能阻止執行。 – Khayralla 2010-10-13 17:29:49

+0

我的意思是 - 您可能需要閱讀一個循環才能閱讀**單個**消息。 – valdo 2010-10-13 18:06:14

0

不僅這是可能的,而且它是客戶端服務器系統中客戶端的經典編碼習慣用法。通常情況下,函數被調用像ExecuteRequest

相關問題