阻塞套接字意味著當發出乙個不能立即完成的套接字呼叫時,其程序將投入睡眠,等待相應操作完成。
非阻塞套接字,如果輸入操作不能被滿足(對於tcp套接字即至少有乙個位元組的資料可讀,對於udp套接字即有乙個完整的資料報可讀),相應呼叫將立即返回乙個ewouldblock錯誤。
注意:selectc通常結合非阻塞式i/o一起使用
如果套接字傳送緩衝區已滿,writen呼叫將會阻塞。在程序阻塞於writen呼叫期間,可能有來自套接字接收緩衝區的資料區的資料可供讀取(偏偏由於程序被阻塞而讀不了)。同理,如果從套接字中有一行輸入文字可讀,那麼照樣可能阻塞於後續的write呼叫。這個時候就顯示出非阻塞讀和寫的好處,但非阻塞式i/o的加入str_cli函式的緩衝區管理顯著地複雜化。於是可簡化版本就是把應用程式任務劃分到多個程序(使用fork)或多個執行緒。
首先介紹一下容納從標準輸入到套接字的資料的buff和從套接字到標準輸入出的buff,如下所示:
相應**此處貼出(實在是有點長,增加了複雜性)
/* include nonb1 */
#include "unp.h"
void
str_cli(file *fp, int sockfd)
else if (n == 0)
else
} if (fd_isset(sockfd, &rset))
else if (n == 0)
else
} /* end nonb2 */
/* include nonb3 */
if (fd_isset(stdout_fileno, &wset) && ((n = friptr - froptr) > 0))
else
} if (fd_isset(sockfd, &wset) && ((n = toiptr - tooptr) > 0))
else
}} }
}/* end nonb3 */
str_cli的較簡單版本(把應用程式任務劃分到多個程序(使用fork))
//此處shutdown關閉寫半部分,因為子程序還可能存在讀,但不能用close(還出於存在引用計數問題考慮)
shutdown(sockfd, shut_wr); /* eof on stdin, send fin */
pause();
return;
}當在乙個非阻塞的tcp套接字上呼叫connect時,connect將立即返回乙個einprogess錯誤,另如果已將發起的tcp三路握手繼續進行。於是關天select和非阻塞connect的兩個規則i、當連線成功建立時,描述符變為可寫;ii、當連線建立遇到錯誤時,描述符變為既可讀又可寫。
#include "unp.h"
intconnect_nonb(int sockfd, const sa *saptr, socklen_t salen, int nsec)
if (fd_isset(sockfd, &rset) || fd_isset(sockfd, &wset))
else
err_quit("select error: sockfd not set");
done:
fcntl(sockfd, f_setfl, flags); /* restore file status flags */
if (error)
return(0);
}
很矛盾哈,這是因為select告訴我們該套接字上已有連線就緒,那麼隨後的accept呼叫不應該阻塞,因為此時阻塞完全沒必要。但有時有特定的條件時,還是需要非阻塞accept的,由於情況比較特殊,此處就不,貼**了,詳情見書上p363頁。
以上知識點來均來自steven先生所著unp卷一(version3),剛開始學習網路程式設計,如有不正確之處請大家多多指正。
UNP卷一chapter20 廣播
型別ipv4 ipv6 tcpudp 所標識介面數 遞送到介面數單播y yyy乙個 乙個任播 y 尚沒有y 一組一組中的乙個 多播可選yy 一組一組中的全體廣播y y全體全體表中要點 i 多播支援在ipv4中是可選的,在ipv6中卻是必需的 ii ipv6不支援廣播。使用廣播的任何ipv4應用程式一...
UNP卷一chapter8 基本UDP套接字程式設計
以下知識點來均來自steven先生所著unp卷一 version3 剛開始學習網路程式設計,如有不正確之處請大家多多指正。需要注意的是,udp不面向連線,故不需要使用connect函式,但使用connect也是可以的,只是作用不再是三次握手建立連線,其作用表現在檢測非同步錯誤 asychronous...
吳恩達ML課程筆記(Chapter 16)
1.幾個說明 n.u the number of users n.m the number of movies r i,j 1 if user j has rated movie i y i,j rating given by user j to movie i 1.題目如下 我們的任務就是,對於使...