我有一個用C寫的dll。 我想發送數據到套接字並在相同的功能接收答案。
例如: -我可以發送到套接字並從它在同一個地方接收它在C
BOOL SendToSocketAndRecv(...)
{
// ...
send(...);
retval = recv(...);
// ...
}
在另一個詞,我的DLL不應該按照客戶端服務器pattren。
這可能嗎?
有幫助嗎?
謝謝 - Khayralla
我有一個用C寫的dll。 我想發送數據到套接字並在相同的功能接收答案。
例如: -我可以發送到套接字並從它在同一個地方接收它在C
BOOL SendToSocketAndRecv(...)
{
// ...
send(...);
retval = recv(...);
// ...
}
在另一個詞,我的DLL不應該按照客戶端服務器pattren。
這可能嗎?
有幫助嗎?
謝謝 - Khayralla
我發送命令的機器人,然後迫不及待地想回答
是的,你有什麼工作。
但是,如果考慮到機器人無論如何都不會迴應的可能性,事情就會開始變得有趣。然後,您需要提供響應超時。很快,其他事情就會開始蔓延。例如,您可能不希望在等待期間陷入閱讀,因爲您可能需要在進入時處理其他事件(用戶輸入或其他來源)。
處理此問題的常見體系結構是使用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()中,等待事件發生。此外,你將不得不弄清楚做正確的超時和一般選擇的細節,但有足夠的那裏。
謝謝Ziffusion,這是一個很好的幫助。 – Khayralla 2010-10-13 18:17:39
recv
的單個調用中接收到這些數據包,反之亦然 - 來自對等方的單音「消息」可能需要多次調用recv
。因此,你應該在循環中讀取消息。不僅這是可能的,而且它是客戶端服務器系統中客戶端的經典編碼習慣用法。通常情況下,函數被調用像ExecuteRequest
你試過了嗎? – 2010-10-13 16:32:49
是的,這是可能的。 – adamk 2010-10-13 16:33:52
我不會說這不符合「遵循客戶端 - 服務器模式」:大多數客戶端/服務器操作涉及發送和接收。例如,一個HTTP客戶端發送一條請求,說「取我這個URL」,並接收一些數據作爲響應。 – 2010-10-13 16:40:33