串列埠與socket通訊

2021-06-19 08:20:03 字數 1462 閱讀 5861

到資訊。對於那種需要很長時間才能完成的操作來說,重疊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...