B
B
Beej's Guide to Network Programming 正體中文版
Search…
B
B
Beej's Guide to Network Programming 正體中文版
簡介
聯絡譯者
簡體中文版
中文授權
原著資訊
進階資料
導讀
何謂 Socket
IP address、結構與資料轉換
從 IPv4 移植為 IPv6
System call 或 Bust
Client-Server 基礎
進階技術
Blocking(阻塞)
select():同步 I/O 多工
不完整傳送的後續處理
Serialization:如何封裝資料
資料封裝
廣播封包:Hello World!
常見的問題
Man 使用手冊
參考資料
原著誌謝
譯者誌謝
Powered By
GitBook
Blocking(阻塞)
你聽過 blocking,只是它在這裡代表什麼鬼東西呢?簡而言之,"block" 就是 "sleep(休眠)" 的技術術語。你以前執行 listener 時可能有注意到,它只是一直在那邊等待,直到有封包抵達才繼續動作。
很多函式都會 block,accept() 會 block,全部的 recv() 函式都會 block。原因是它們有權這麼做。
當你先用 socket() 建立 socket descriptor 時,kernel(核心)會將它設定為 blocking。若你不想要 blocking socket,你必須呼叫 fcntl():
1
#include <unistd.h>
2
#include <fcntl.h>
3
.
4
.
5
.
6
sockfd = socket(PF_INET, SOCK_STREAM, 0);
7
fcntl(sockfd, F_SETFL, O_NONBLOCK);
8
.
9
.
10
.
Copied!
將 socket 設定為 non-blocking(非阻塞),你就能 "poll(輪詢)" socket 以取得資訊。如果你試著讀取 non-blocking socket,而 socket 沒有資料時,函式就不會發生 block,而是傳回 -1,並將 errno 設定為 EWOULDBLOCK。
然而,一般來說,這樣 polling 是不好的想法。如果你讓程式一直忙著查 socket 上是否有資料,則會浪費 CPU 的時間,這樣是不合適的。比較漂亮的解法是利用下一節的 select() 來檢查 socket 是否有資料需要讀取。
Previous
進階技術
Next
select():同步 I/O 多工
Last modified
1yr ago
Copy link