CSocket原始碼分析

2021-06-19 03:35:34 字數 1914 閱讀 2047

csocket中的create函式呼叫socket()函式,此函式建立套接字,並將套接字和乙個視窗關聯,然後呼叫bind繫結套接字。

bool casyncsocket::create(uint nsocketport, int nsockettype,long levent, lpctstr lpszsocketaddress)

return false;

}

因此如果是客戶端**建議直接呼叫socket**進行建立套接字,而不是呼叫create建立套接字,因客戶端不需要呼叫bind進行套接字的繫結。

socket**

bool casyncsocket::socket(int nsockettype, long levent,

int nprotocoltype, int naddressformat)

return false;

}

下面是attachhandle**,此函式主要是建立乙個 視窗(如果是第一次建立套接字,否則不建立視窗)進行套接字訊息的接收,如fd_accet等通知訊息

attachhandle()的部分**

if (pstate->m_pmapsockethandle->isempty())   //如果是第一次建立套接字

assert(pwnd->m_hwnd != null);

assert(cwnd::fromhandlepermanent(pwnd->m_hwnd) == pwnd);

pstate->m_hsocketwindow = pwnd->m_hwnd; //設定套接字視窗為新建的視窗

}pstate->m_pmapsockethandle->setat((void*)hsocket, psocket); //隨後建立的套接字和csocket物件進行繫結

下面在看下csocket是如何將非同步改為同步的

int csocket::receive(void* lpbuf, int nbuflen, int nflags)

int nresult;

//從下面的迴圈可以看出點端倪,它是迴圈呼叫receive進行訊息接收,從而將非同步的轉變為同步,此實現的關鍵是pumpmessages這個函式,pumpmessages比較複雜。

while ((nresult = casyncsocket::receive(lpbuf, nbuflen, nflags)) == socket_error) //呼叫casyncsocket::receive它呼叫recv進行訊息的接收

else

return socket_error;

} return nresult;

}

pumpmessages返回的情況

1.呼叫peekmessage提取訊息,如果為fd_close或fd_read則返回,說明此時可以呼叫receive

2.此函式開始處設定了乙個定時器,如果在定時器超時之前還沒收到fd_close或fd_read訊息則返回

3.呼叫peekmessage獲取其他訊息,如果有其他訊息則處理其他訊息,處理完之後,繼續在pumpmessages中的迴圈,回到第一步的監測,如果沒有其他的訊息則呼叫waitmessage釋放控制權,直到有訊息到達。

綜上所述,csocket利用自己改寫的receive,將套接字從非阻塞轉為阻塞模式,但他不是單純的阻塞,還提供了一些其他的機制,如他在阻塞期間還可以處理視窗的其他訊息,預設是只處理wm_paint訊息,但使用者可以改寫onmessagepending處理其他的訊息。

其他的accept,send原理都和receive差不多,都將非阻塞模式轉為阻塞模式,另外send提供了另外的機制,他可以保證所要發的資料全部傳送完,而不用程式設計師自己寫**保證所要傳送的資料全部傳送完

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...