久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 從緩沖上看阻塞與非阻塞socket在發(fā)送接收上的區(qū)別 [打印本頁]

作者: 51黑tt    時間: 2016-3-5 17:13
標題: 從緩沖上看阻塞與非阻塞socket在發(fā)送接收上的區(qū)別
   最近在網(wǎng)絡上看到一些帖子以及回復,同時又搜索了一些網(wǎng)絡上關于阻塞非阻塞區(qū)別的描述,發(fā)現(xiàn)很多人在描述兩者的發(fā)送接收時操作返回以及緩沖區(qū)處理的區(qū)別時有不同程度的誤解。所以我想寫一篇文章來糾正錯誤,并作為記錄方便查閱,如有轉載,注明作者(jwybobo2007)以及出處即可。
  首先socket在默認情況下是阻塞狀態(tài)的(未指異步操作以及其它一些特殊用途下,直接默認為非阻塞),這就使得發(fā)送以及接收操作處于阻塞的狀態(tài),即調用不會立即返回,而是進入睡眠等待操作完成。下面把討論點分為發(fā)送以及接收。
一.發(fā)送選用send(這里特指TCP)以及sendto(這里特指UDP)來描述
    首先需要說明的是,不管阻塞還是非阻塞,在發(fā)送時都會將數(shù)據(jù)從應用緩沖區(qū)拷貝到內核緩沖區(qū)(SO_RCVBUF選項聲明,除非緩沖區(qū)大小為0)。我在網(wǎng)絡上看到某些人說,阻塞就是將數(shù)據(jù)真正發(fā)送給對方,并且阻塞是發(fā)生在需要把前面的所有數(shù)據(jù)全部發(fā)送出去,然后再發(fā)送本次的,而非阻塞則是拷貝到發(fā)送緩沖區(qū)。我不得不說,上面的這種說法是錯誤的。
    在阻塞模式下send操作將會等待所有數(shù)據(jù)均被拷貝到發(fā)送緩沖區(qū)后才會返回。
    如果當前發(fā)送緩沖總大小為8192,已經(jīng)拷貝到緩沖的數(shù)據(jù)為8000,那剩余的大小為192,現(xiàn)在需要發(fā)送2000字節(jié)數(shù)據(jù),那阻塞發(fā)送就會等待緩沖區(qū)足夠把所有2000字節(jié)數(shù)據(jù)拷貝進去,如第一次拷貝進192字節(jié),當緩沖區(qū)成功發(fā)送出1808字節(jié)后,再把應用緩沖區(qū)剩余的1808字節(jié)拷貝到內核緩沖,而后send操作返回成功發(fā)送字節(jié)數(shù)。
    從上面的過程不難看出,阻塞的send操作返回的發(fā)送大小,必然是你參數(shù)中的發(fā)送長度的大小。
    在阻塞模式下的sendto操作不會阻塞。
    關于這一點的原因在于:UDP并沒有真正的發(fā)送緩沖區(qū),它所做的只是將應用緩沖區(qū)拷貝給下層協(xié)議棧,在此過程中加上UDP頭,IP頭,所以實際不存在阻塞。
    在非阻塞模式下send操作調用會立即返回。
    關于立即返回大家都不會有異議。還是拿阻塞send的那個例子來看,當緩沖區(qū)只有192字節(jié),但是卻需要發(fā)送2000字節(jié)時,此時調用立即返回,并得到返回值為192。從中可以看到,非阻塞send僅僅是盡自己的能力向緩沖區(qū)拷貝盡可能多的數(shù)據(jù),因此在非阻塞下send才有可能返回比你參數(shù)中的發(fā)送長度小的值。
    如果緩沖區(qū)沒有任何空間時呢?這時肯定也是立即返回,但是你會得到WSAEWOULDBLOCK/E WOULDBLOCK 的錯誤,此時表示你無法拷貝任何數(shù)據(jù)到緩沖區(qū),你最好休息一下再嘗試發(fā)送。
    在非阻塞模式下sendto操作 不會阻塞(與阻塞一致,不作說明)。

二.接收選用recv(這里特指TCP)以及recvfrom(這里特指UDP)來描述
    在阻塞模式下recv,recvfrom操作將會阻塞 到緩沖區(qū)里有至少一個字節(jié)(TCP)或者一個完整UDP數(shù)據(jù)報才返回。
    在沒有數(shù)據(jù)到來時,對它們的調用都將處于睡眠狀態(tài),不會返回。
    在非阻塞模式下recv,recvfrom操作將會立即返回。
    如果緩沖區(qū) 有任何一個字節(jié)數(shù)據(jù)(TCP)或者一個完整UDP數(shù)據(jù)報,它們將會返回接收到的數(shù)據(jù)大小。而如果沒有任何數(shù)據(jù)則返回錯誤 WSAEWOULDBLOCK/E WOULDBLOCK。

  以上是關于阻塞非阻塞發(fā)送接收的區(qū)別以及在緩沖區(qū)處理上的差別,希望給看到這篇文章的人一些幫助。同時也想糾正網(wǎng)絡上的某些錯誤觀點,文章中表述如有錯誤,望大家指正,謝謝。






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 四虎精品在线 | 黄色三级视频 | 高清一区二区三区 | 欧美一区二区三区的 | 国产激情一区二区三区 | 国产在线小视频 | 日韩少妇 | 91av免费 | 欧美精品www | 国产一区二区三区久久 | 国产精品国产三级国产 | 日日干天天射 | 国产这里只有精品 | 成人免费看| 日本色视频 | 草草视频在线 | 欧美日韩中文字幕 | 日产精品久久久一区二区 | 国产一区在线看 | a视频在线免费观看 | 高清乱码男女免费观看 | 久久久网 | 欧美激情xxxx | 视频一区在线播放 | 亚洲综合第一页 | 中文字幕在线免费观看 | 国模一区二区 | 欧美激情成人 | 欧美黄色一级视频 | 欧美视频久久 | 成人黄性视频 | 国产午夜精品一区二区三区视频 | 91爱看 | 色噜噜狠狠一区二区三区 | 韩日视频 | 国产中文 | 欧美一级淫片免费视频黄 | 亚洲在线 | 伊人久久综合 | 国产精品福利在线 | 欧美特黄|