UNP卷一chapter16 非阻塞式I O

2021-08-20 06:39:51 字數 2290 閱讀 3502

阻塞套接字意味著當發出乙個不能立即完成的套接字呼叫時,其程序將投入睡眠,等待相應操作完成。

非阻塞套接字,如果輸入操作不能被滿足(對於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.題目如下 我們的任務就是,對於使...