我自己封裝了一個mysocket類,里面用的是win32 的api進行socket,是TCP協議通信。這個類的作用就是作為一個客戶端,連到指定的服務器上,然后跟服務器進行資料互動。按照TCP客戶端的通信步驟,本來應該是send一次之后就要呼叫一次recv。我覺得這樣很麻煩,就自己做了一個執行緒,執行緒里有一個死回圈,一直接收資料。問題就是,我下一次send的時候需要先收到上一次的回應資料,然后根據決議的結果來確定要發什么訊息。我嘗試過在接收的子執行緒里用postThreadMessage 來實作,但是這個時候主執行緒會卡死在getmessage這里。請問一下有比較好的方法解決這個問題嗎
uj5u.com熱心網友回復:

這個就是涉及到設計模式什么的了,我是采用介面回呼的方式,回呼函式onRecv,或者提供一個方法GetMessage 遍歷接收到的資料包
uj5u.com熱心網友回復:
大兄弟,能詳細一點嗎,這方面我不太熟啊,謝謝
uj5u.com熱心網友回復:
如果不是UI執行緒, 應該使用 Event 或 Mutex 等同步信號量如果是UI執行緒 使用PeekMessage 來替換GetMessage
uj5u.com熱心網友回復:
這個不設計到UI,是我自己想做一個專門用于socket通訊的類, 這是在一個類里面。
uj5u.com熱心網友回復:
不知道有多少前人掉在TCP Socketsend(人多)send(病少)send(財富)
recv(人多病)recv(少財富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
uj5u.com熱心網友回復:
你也不一定要使用postThreadMessage ,你可以使用一個全域緩沖區,兩個執行緒共同使用,然后加同步uj5u.com熱心網友回復:
WSAAsyncSelect用訊息機制來處理收發uj5u.com熱心網友回復:
其實完全沒必要那么復雜,在rev使用環行鏈表,strcut xx{int sign;char *data;}保存接收的資料,,每接收完一個包,sign置1表示該鏈表有資料,,然后,send里回圈判斷是否有置sign為1,有拷貝該資料到快取區,sign置0.
其實只要不是涉及到p2p的客戶端,對硬體資源來說,沒有半點的壓力.
uj5u.com熱心網友回復:
當然如果鏈表里有同步就更好了.uj5u.com熱心網友回復:
你問的問題分兩個,回答不了太細:1)關于Socket通訊,如果是windows環境下,可以看下重疊IO,網上有很多例子,基于事件通知的模式,可以解決你“什么時候該去接收”的問題。
2)關于執行緒同步,一般來說建議用帶鎖的同步佇列+事件通知的形式,生產消費模式,沒太大必要去用postThreadMessage之類的系統API來介入。
uj5u.com熱心網友回復:
開個執行緒用WSAWaitForMultipleEvents模型,處理接收,接收處理完了選擇send內容,程序清晰;在復雜點的IOCP了解下轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/65477.html
標籤:網絡編程
