<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    看到關于socket非阻塞模式設置方式記錄一下。

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    關于socket的阻塞與非阻塞模式以及它們之間的優缺點,這已經沒什么可言的;我打個很簡單的比方,如果你調用socket send函數時;

    如果是阻塞模式下:

    send先比較待發送數據的長度len和套接字s的發送緩沖的長度,如果len大于s的發送緩沖區的長度,該函數返回SOCKET_ERROR;如果len小于或者等于s的發送緩沖區的長度,那么send先檢查協議是否正在發送s的發送緩沖中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送s的發送緩沖中的數據或者s的發送緩沖中沒有數據,那么 send就比較s的發送緩沖區的剩余空間和len,如果len大于剩余空間大小,send就一直等待協議把s的發送緩沖中的數據發送完,如果len小于剩余空間大小send就僅僅把buf中的數據copy到剩余空間里

    如果是非阻塞模式下:

    在調用socket send函數時,如果能寫到socket緩沖區時,就寫數據并返回實際寫的字節數目,當然這個返回的實際值可能比你所要寫的數據長度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可寫的話,就直接返回SOCKET_ERROR了,所以沒有等待的過程。。

    經過上面的介紹后,下面介紹如何設置socket的非阻塞模式:

    當使用socket()函數和WSASocket()函數創建套接字時,默認都是阻塞的。在創建套接字之后,通過調用ioctlsocket()函數,將該套接字設置為非阻塞模式。

    //-------------------------

    // Set the socket I/O mode: In this case FIONBIO

    // enables or disables the blocking mode for the

    // socket based on the numerical value of iMode.

    // If iMode = 0, blocking is enabled;

    // If iMode != 0, non-blocking mode is enabled.

    u_long iMode = 1;  //non-blocking mode is enabled.

    ioctlsocket(m_socket, FIONBIO, &iMode); //設置為非阻塞模式

    套接字設置為非阻塞模式后,在調用Windows Sockets API函數時,調用函數會立即返回。大多數情況下,這些函數調用都會調用“失敗”,并返回WSAEWOULDBLOCK錯誤代碼。說明請求的操作在調用期間內沒有時間完成。通常,應用程序需要重復調用該函數,直到獲得成功返回代碼。 不同的Windows Sockets API函數,在調用失敗時返回的WSAEWOULDBLOCK錯誤代碼具有不同的含義

    需要說明的是并非所有的 Windows Sockets API 在非阻塞模式下調用,都會返回 WSAEWOULDBLOCK 錯誤。例如,以非阻塞模式的套接字為參數調用 bind() 函數時,就不會返回該錯誤代碼。當然,在調用 WSAStartup() 函數時更不會返回該錯誤代碼,因為該函數是應用程序第一調用的函數,當然不會返回這樣的錯誤代碼。

    要將套接字設置為非阻塞模式,除了使用 ioctlsocket() 函數之外,還可以使用 WSAAsyncselect() 和 WSAEventselect() 函數。當調用該函數時,套接字會自動地設置為非阻塞方式:

    The WSAAsyncSelect function automatically sets socket s to nonblocking mode, regardless of the value of lEvent .

    The WSAEventSelect function automatically sets socket s to nonblocking mode, regardless of the value of lNetworkEvents .

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全