在前面的系列網絡程式設計文章中,我們都是使用socket 自己實作用戶端和伺服器端來互相發資料測試,現在嘗試使用socket 用戶端發
送http 請求給某個網站,然後接收網站的響應資料。http 協定參考 這裡。
代碼如下:
輸出如下:

.............................省略................................
從上面的輸出可以看到有完整的<html> </html> ,即已經完整接收,但有一點不解的是為什麼最後會接收到一個0?
Chunked transfer encoding uses a chunk size of 0 to mark the end of the content.
程式中 struct timeval timeout = {3,0};
setsockopt(socket_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
設定逾時時間為3s,現在recv 為阻塞接收,如果逾時時間内接收緩沖區沒有一點資料,則傳回-1 且errno = EWOULDBLOCK 。
退出循環,程式結束。
在這裡順便提一下,recv的第四個參數如果設定為MSG_WAITALL,在阻塞模式下不等到指定數目的資料是不會傳回的,除非逾時時間到或者被信号打斷。但在這裡我們并不知道對方會發來具體多少資料,是以不能使用這種方法來讀取資料,否則可能出現一直阻塞的情況。
注:在阻塞發送時,也有人喜歡設定發送逾時,逾時判斷傳回值,如果沒有發送完整則繼續發送。但實際上本身阻塞發送會一直阻
塞到發送完整才傳回,好像二者并無大的差別。