我是C/C++中socket編程的新手。我寫了Client和Server Socket。他們可以發送和接收字符串。 這個想法是將命令發送到字符串中的服務器。它可以看起來像這樣:「GET X」或「SET X 2」。我知道我如何拆分字符串。程序知道字符串中的第一個單詞是命令,第二個單詞是屬性,第三個單詞可以是SET-Command的值。 我的問題是我怎麼可以說程序,如果它得到字符串「GET X」它應該調用函數get(屬性)。 我認爲第一個關於開關盒的,但我認爲這不是最好的解決方案。 如果它會是很多的命令。 謝謝你c socket發送字符串命令
0
A
回答
0
我認爲最好使用switch語句。
如果不是,您可以使用一個映射命令字符串作爲鍵和指向回調函數的指針作爲值。
+0
並且一定要檢查密鑰是否存在,否則你的程序可能會爆炸。 – Marlon 2011-05-04 20:33:04
0
你可以這樣做的一種方法是有一個函數查找表,你可以調用這個函數,這取決於所有返回char*
的命令,並將響應發送回客戶端。當然你必須做一個基本的散列函數。
1
基本上可以將問題歸結爲將操作名稱映射到正在調用的實際函數的最佳方式,以及是否真的需要具有更好查找特性的解決方案。
- 對於少數函數,基於簡單的基於
O(n)
的解決方案(例如線性搜索)就足夠了。 - 基於
O(log(n))
的方法(例如self-balancing binary trees)對於更多操作也是足夠的。 - 由於理論上的
O(1)
查找特性,大多數人都跳轉到基於hash table的解決方案。但是,這取決於一個好的散列函數,它本身在成本方面不是免費的。
總是有時間和空間的權衡。因此,在確定哪種方法最適合您的應用程序之前,最好進行配置。
無論如何,這類操作調度問題已經被深入研究。例如,這裏的one paper討論了CORBA C++ ORB實現中的操作調度策略。
除了優化運行查詢,你可能必須處理其他因素,如:
- 併發:需要您的應用程序來處理來自客戶端並行多個連接?分佈式併發通常很難正確實現。
- 序列化:您將如何通過線路發送和接收數據?你可能會遇到的問題包括:發送純文本可能是緩慢的,數值可能被轉換到接收平臺endianness,你係列化協議可能會改變會影響你的用戶等
還有很多其他可能您也必須在客戶端處理問題。如果可能的話,我建議使用現有的類RPC技術,而不是自己重新發明輪子。
相關問題
- 1. 發送命令和字符串COM1
- 2. android open socket併發送命令
- 3. C#發送命令
- 4. c#通過串口發送命令
- 5. 用C#發送寫命令到串口?
- 6. C++/CLI串口發送命令
- 7. 發送一個字符串命令到套接字
- 8. 發送命令和C++
- 9. C#發送VNC命令
- 10. Socket編程 - 發送/接收十六進制和字符串
- 11. 如何發送字符串/命令標準輸入
- 12. 在plink中發送非命令字符串
- 13. 發送命令和字符串Terminal.app使用AppleScript
- 14. 使用AppleScript發送命令和字符串到Terminal.app回聲關
- 15. 根據命令向客戶端發送字符串JAVA
- 16. C++管道字符串郵件命令
- 17. C:命令行參數與字符串
- 18. C#+ Discord.NET - 帶字符串的命令?
- 19. C++命令行字符串像Java?
- 20. C socket編程,發送
- 21. c socket發送失敗
- 22. Python的socket發送不發送我有麻煩了整個字符串
- 23. 在socket編程中發送多個字符串python
- 24. 發送字符串串行
- 25. c socket revcv收到截斷字符串
- 26. 發送命令串口,MVC應用
- 27. 發送JSON字符串到C#方法
- 28. 發送char *到字符串c#
- 29. 發送PHP字符串到C++
- 30. 發送C#字符串到.PHP頁面
您可以使用C或C++進行編程,但不能同時使用它們,因爲它們是不同的語言。請使用適當的標籤並指定您正在使用的語言。 – 2011-05-04 19:23:50
你基本上正在實現遠程過程調用。除非你爲了教育目的這麼做,爲什麼要重新發明輪子?有許多RPC技術可用於多種編程語言。這些技術的簡要列表可以在這裏找到:http://en.wikipedia.org/wiki/Remote_procedure_call – Void 2011-05-04 19:47:56
@Seth Carnegie技術上可以將C文件包含在C++項目中,或者服務器和客戶端可能使用不同的語言。這兩種情況都不是這種情況,但這些都是可能性。 – patrickvacek 2011-05-04 20:34:50