久久久久久久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爱看
|
色噜噜狠狠一区二区三区
|
韩日视频
|
国产中文
|
欧美一级淫片免费视频黄
|
亚洲在线
|
伊人久久综合
|
国产精品福利在线
|
欧美特黄
|