阻塞 非阻塞socket的理解

2021-08-31 06:19:47 字數 1056 閱讀 3662

[b]阻塞socket是這樣的[/b]

recv(socket1, buf, length);

去網絡卡緩衝區讀取socket1的資料,讀到的資料儲存到buf

如果網絡卡緩衝區有1個位元組,就返回1個,有兩個就返回兩個,當然不能超過length

如果網絡卡緩衝區沒有資料,那麼就一直等待,直到有資料可讀

是的,很傻很執著 :)

如果客戶端再也不傳送資料過來,那麼就永遠的等下去,這顯然不夠靈活

可以通過

setsockopt(sock, sol_socket, so_rcvtimeo, (char*)&timeout, sizeof(timeout));

設定等待時間

如果超過了這個等待時間,還沒有收到資料就不等了,函式就返回

[b]非阻塞socket是這樣的[/b]

呼叫函式

unsigned long ul = 1;

ioctlsocket(sserver, fionbio, (unsigned long*)&ul);

設定為非阻塞

然後呼叫

recv(socket1, buf, length);

這兒的執行方式為:去檢視網絡卡緩衝區有無資料,如果有那麼讀取資料並返回,[color=red]如果沒有不等待直接返回。[/color]這兒就是與阻塞socket的不同

非阻塞socket的資料讀取方式:

bool socketutils::recvnonblock(socket sock, char *buf, int length)

}else if(nval == socket_error)else

}else if(nval == 0)

}printf("[error] socket recv over %d times\n", maxrecvtimes);

return false;

}

socket阻塞態 非阻塞態理解

send函式 如果可用空間大小小於要傳送的資料長度,則send會被阻塞,直到緩衝區中的資料被傳送到目標主機,有了足夠的空間之後,send函式才會將資料寫入輸出緩衝區。要寫入的資料大於輸出緩衝區的最大長度的時候,要分多次寫入,直到所有資料都被寫到緩衝區之後,send函式才會返回。recv函式 函式先檢...

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...