到資訊。對於那種需要很長時間才能完成的操作來說,重疊i/o機制尤其有用,因為發起
重疊操作的執行緒在重疊請求發出後就可以自由地做別的事情了。
在windows nt/2000上,提供真正可擴充套件的i/o模型就是使用完成埠(completion
port)的重疊i/o。
……可以把完成埠看成系統維護的乙個佇列,作業系統把重疊i/o操作完成的事件通知
放到該佇列裡,由於是暴露「操作完成」的事件通知,所以命名為「完成埠」(completion
ports)。乙個socket被建立後,可以在任何時刻和乙個完成埠聯絡起來。
一般來說,乙個應用程式可以建立多個工作執行緒來處理完成埠上的通知事件。工作
執行緒的數量依賴於程式的具體需要。但是在理想的情況下,應該對應乙個cpu建立乙個線
程。因為在完成埠理想模型中,每個執行緒都可以從系統獲得乙個「原子」性的時間片,輪
番執行並檢查完成埠,執行緒的切換是額外的開銷。在實際開發的時候,還要考慮這些線
程是否牽涉到其他堵塞操作的情況。如果某執行緒進行堵塞操作,系統則將其掛起,讓別的
執行緒獲得執行時間。因此,如果有這樣的情況,可以多建立幾個執行緒來盡量利用時間。
應用完成埠分兩步走:
1. 建立完成埠控制代碼:
handle hiocp;
hiocp=createiocompletionport(
invalid_handle_value,
null,
(ulong_ptr)0,
0);if(hiocp==null)
注意在第1個引數(filehandle)傳入invalid_file_handle,第2個引數(existingcompletionport)
傳入null,系統將建立乙個新的完成埠控制代碼,沒有任何i/o控制代碼與其關聯。
2. 完成埠建立成功後,在socket和完成埠之間建立關聯。再次呼叫createiocompletionport
函式,這一次在第1個引數filehandle傳入建立的socket控制代碼,引數existingcompletionport
為已經建立的完成埠控制代碼。
以下**建立了乙個socket並把它和完成埠聯絡起來。
socket s;
s=socket(af_inet,sock_stream,0);
if(s==invalid_socket)
}到此為止,socket已經成功和完成埠相關聯。在此socket進行的重疊i/o操作結果均
使用完成埠發出通知。
注意:createiocompletionport函式的第3個引數允許開發人員傳入乙個型別為ulong_ptr
的資料成員,我們把它稱為完成鍵(completion key),此資料成員可以設計為指向包含socket
資訊的乙個結構體的乙個指標,用來把相關的環境資訊和socket聯絡起來,每次完成通知來
到的同時,該環境資訊也隨著通知一起返回給開發人員。
串列埠與socket通訊
2.完成埠建立成功後,在socket和完成埠之間建立關聯。再次呼叫createiocompletionport 函式,這一次在第1個引數filehandle傳入建立的socket控制代碼,引數existingcompletionport 為已經建立的完成埠控制代碼。以下 建立了乙個socket並把它...
串列埠轉socket通訊
做了乙個串列埠轉socket的通訊。大概意思就是開發板串列埠收到的資訊。通過socket傳出去 這裡因為是要用到socket。所以要實現wifi模組的sta模式。因為我這是單串列埠線。我實現的是串列埠線實現接收到的資訊。遠端網路ssh登陸的開發板。給串列埠傳資訊我用的w7端的串列埠除錯助手。sock...
Socket通訊 和 串列埠通訊 (有人的硬體)
硬體採用的是 有人公司 的串列埠轉wifi模組。該模組可以實現串列埠透傳。軟體如下 硬體模組設定為 tcp server using system using system.windows.forms using system.io.ports using system.io using syste...