日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

recv 和 send 阻塞和非阻塞的区别

發(fā)布時(shí)間:2024/10/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 recv 和 send 阻塞和非阻塞的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

答案

深入說(shuō)明

在 epoll 中的應(yīng)用

總結(jié)

拓展


答案

  • 阻塞,事情干不完就不要回來(lái)了!
  • 非阻塞,能干多少就是多少,趕緊回來(lái)!
  • 深入說(shuō)明

    // 將內(nèi)核接收緩沖區(qū)中的數(shù)據(jù) copy 到應(yīng)用層中用戶的 buffer 中。 int recv(int sockfd, void *buf, size_t len, int flag); // 將應(yīng)用層中用戶的 buffer 中的數(shù)據(jù) copy 到內(nèi)核發(fā)送緩沖區(qū)中。 int send(int sockfd, void *buf, size_t len, int flag);

    1、recv?

    阻塞模式下,如果內(nèi)核的接收緩沖區(qū)中沒有數(shù)據(jù)時(shí),該函數(shù)就會(huì)阻塞。

    非阻塞模式下,如果內(nèi)核的接收緩沖區(qū)中沒有數(shù)據(jù)時(shí),該函數(shù)就會(huì)返回。

    2、send

    阻塞模式下,如果發(fā)送緩沖區(qū)剩余的空間小于要發(fā)送的數(shù)據(jù)的大小,那么該函數(shù)會(huì)阻塞。

    非阻塞模式下,如果發(fā)送緩沖區(qū)剩余的空間大于要發(fā)送的數(shù)據(jù)的大小,那么該函數(shù)會(huì)返回。

    在 epoll 中的應(yīng)用

    1、水平觸發(fā)模式(LT)

    在該模式下,recv 和 send 為阻塞和非阻塞,結(jié)果是一樣的。

    舉 recv 栗子來(lái)說(shuō),因?yàn)樵谠撚|發(fā)模式下,只要內(nèi)核的接收緩沖區(qū)中有數(shù)據(jù),epoll_wait()?函數(shù)都會(huì)返回,這就導(dǎo)致了雖然 recv 是阻塞模式的,但是每次調(diào)用時(shí),內(nèi)核緩沖區(qū)都是有數(shù)據(jù)的,所以不會(huì)導(dǎo)致 recv 阻塞。當(dāng)然了,當(dāng) recv 時(shí)是非阻塞的,就更不會(huì)造成阻塞情況了。同理,對(duì)于 send 也是一樣的。

    2、邊沿觸發(fā)模式(LT)

    在該模式下,recv 和 send 需要為非阻塞模式,不然就會(huì)有問(wèn)題。

    還是舉 recv 栗子來(lái)說(shuō),因?yàn)樵谠撃J较?#xff0c;內(nèi)核的接收緩沖區(qū)來(lái)數(shù)據(jù)了,那么 epoll_wait() 函數(shù)就會(huì)返回,但是僅僅返回一次,它可不管你是否在該次中是否完全取走了內(nèi)核接收緩沖區(qū)中的數(shù)據(jù)。

    在上述的前提下,recv 需要一個(gè) while (true) 循環(huán),保證將緩沖區(qū)中的數(shù)據(jù)取空。這就產(chǎn)生了一個(gè)問(wèn)題,因?yàn)榧偃?recv 是阻塞的,那么當(dāng)內(nèi)核緩沖區(qū)中沒有數(shù)據(jù)時(shí),該函數(shù)就會(huì)阻塞,這是致命的,所以 recv 必須是非阻塞的。

    同理,對(duì)于 send 也是一樣的。理想情況時(shí),終于有機(jī)會(huì)向?qū)Χ税l(fā)送數(shù)據(jù)了,一定要將想發(fā)的數(shù)據(jù)發(fā)盡。這就有問(wèn)題了,如果是阻塞的,如果發(fā)到一半,發(fā)送緩沖區(qū)滿了,那么該函數(shù)就阻塞了,實(shí)際上要避免這種情況,所以要將該 send 設(shè)置為非阻塞的。

    總結(jié)

  • 在水平觸發(fā)模式下,recv 和 send 阻塞和非阻塞模式均可。

  • 在邊沿觸發(fā)模式下,recv 和 send 必須為非阻塞模式。

  • 拓展

    1、將socket設(shè)置為非阻塞模式的方法。(socket設(shè)置為非阻塞的,recv 和 send 要設(shè)置為非阻塞的)

    int flags = fcntl(sockfd, F_GETFL, 0); //獲取文件的flags值。fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //設(shè)置成非阻塞模式; int n = recv(fd, pbuff, kBuffLen, MSG_DONTWAIT);

    ?2、將socket設(shè)置為阻塞模式的方法。

    int flags = fcntl(sockfd, F_GETFL, 0); //獲取文件的flags值。fcntl(sockfd, F_SETFL, flags | ~O_NONBLOCK); //設(shè)置成阻塞模式; int n = recv(fd, pbuff, kBuffLen, 0); // flag = 0,默認(rèn)是阻塞的。

    ?

    (SAW:Game Over!)

    總結(jié)

    以上是生活随笔為你收集整理的recv 和 send 阻塞和非阻塞的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 禁漫天堂黄漫画无遮挡观看 | 丝袜美腿一区二区三区 | 九七在线视频 | 999久久久久 | 久久久精品视频在线 | 亚洲熟妇国产熟妇肥婆 | 极品国产在线 | 亚洲免费av网站 | 正在播放一区二区 | 日韩欧美国产激情 | 日本精品一二三 | 污视频网站在线 | 和漂亮岳做爰3中文字幕 | 亚州福利| 久久久久激情 | 免费成人在线播放 | 中国一区二区三区 | 毛片在线观看网站 | 日本极品喷水 | 亚洲av永久无码国产精品久久 | 驯服少爷漫画免费观看下拉式漫画 | 一级片毛片 | 日韩乱码一区二区 | 在线岛国 | 成人午夜精品福利 | 日韩人妻精品一区二区三区视频 | 国产在线观看不卡 | 精品爆乳一区二区三区 | 五月丁香啪啪 | 亚洲最大网 | 高清一区二区三区四区 | 国产欧美日韩 | 国产乱来| 超碰中文字幕 | 中文字字幕一区二区三区四区五区 | 国产精品黄视频 | 久久精品在线观看 | 欧美专区日韩专区 | 日韩色影院| 97人人模人人爽人人少妇 | 欧美成综合| 午夜视频免费看 | 久久久久国产一区二区三区潘金莲 | 91精品国产91 | 国产美女91呻吟求 | 九九热国产视频 | 福利国产在线 | 91亚洲精品国偷拍自产在线观看 | 亚洲国产欧美精品 | 丰满秘书被猛烈进入高清播放在 | 国产精品一区二区三区在线免费观看 | 亚洲va中文字幕 | 夜夜嗨一区二区三区 | 快射视频网站 | 四虎永久地址 | 国产麻豆91视频 | 草1024榴社区成人 | 福利资源导航 | 国产精品久久久久电影 | 天天爱天天草 | 理论片在线观看理伦片 | 97超碰人人网 | 免费成人蒂法网站 | 懂色av蜜臀av粉嫩av | 亚洲精品ww | 中文字幕在线视频日韩 | 国产精品乱子伦 | 免费网站黄色 | 国产亚洲av综合人人澡精品 | 伊人精品综合 | 神马久久午夜 | 国产精品久久91 | 成人午夜毛片 | 制服丝袜一区二区三区 | 韩日av在线播放 | 在线观看日韩av电影 | 四虎国产精品成人免费入口 | 国产精品1234 | 国产精品一区二区久久毛片 | 激情内射人妻1区2区3区 | 葵司有码中文字幕二三区 | 91久久婷婷 | 极品美女被c | 欧美有码在线 | 潘金莲性xxxxhd | 超碰xxx| 国产特级av | 国产视频精品久久 | 日本黄色电影网址 | 一级激情视频 | 影音先锋在线播放 | 一卡二卡三卡 | 极品美妇后花庭翘臀娇吟小说 | 久草视频免费看 | 国产一级特黄 | 久久77| 国产麻豆剧传媒精品国产 | av黄色影院| 操你啦影院 |