一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進(jìn)程|Fedora|注冊(cè)表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別

Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別

2021-12-29 16:32Linux教程網(wǎng) Linux

這篇文章主要介紹了Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別的相關(guān)資料,需要的朋友可以參考下

Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別

UDP socket 設(shè)置為的非阻塞模式

?
1
Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen);

UDP socket 設(shè)置為的阻塞模式

?
1
Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (struct sockaddr *)&SockAddr,&ScokAddrLen);

Linux socket編程之阻塞套接字和非阻塞套接字

  每一個(gè)TCP套接口有一個(gè)發(fā)送緩沖區(qū),可以用SO_SNDBUF套接口選項(xiàng)來改變這個(gè)緩沖區(qū)的大小。當(dāng)應(yīng)用進(jìn)程調(diào)用 write時(shí),內(nèi)核從應(yīng)用進(jìn)程的緩沖區(qū)中拷貝所有數(shù)據(jù)到套接口的發(fā)送緩沖區(qū)。如果套接口的發(fā)送緩沖區(qū)容不下應(yīng)用程序的所有數(shù)據(jù)(或是應(yīng)用進(jìn)程的緩沖區(qū)大于套接口發(fā)送緩沖區(qū),或是套接口發(fā)送緩沖區(qū)還有其他數(shù)據(jù)),應(yīng)用進(jìn)程將被掛起(睡眠)。這里假設(shè)套接口是阻塞的,這是通常的缺省設(shè)置。內(nèi)核將不從write系統(tǒng)調(diào)用返回,直到應(yīng)用進(jìn)程緩沖區(qū)中的所有數(shù)據(jù)都拷貝到套接口發(fā)送緩沖區(qū)。因此從寫一個(gè)TCP套接口的write調(diào)用成功返回僅僅表示我們可以重新使用應(yīng)用進(jìn)程的緩沖區(qū)。它并不告訴我們對(duì)端的 TCP或應(yīng)用進(jìn)程已經(jīng)接收了數(shù)據(jù)。 

    TCP取套接口發(fā)送緩沖區(qū)的數(shù)據(jù)并把它發(fā)送給對(duì)端TCP,其過程基于TCP數(shù)據(jù)傳輸?shù)乃幸?guī)則。對(duì)端TCP必須確認(rèn)收到的數(shù)據(jù),只有收到對(duì)端的ACK,本端TCP才能刪除套接口發(fā)送緩沖區(qū)中已經(jīng)確認(rèn)的數(shù)據(jù)。TCP必須保留數(shù)據(jù)拷貝直到對(duì)端確認(rèn)為止。

1 輸入操作: read、readv、recv、recvfrom、recvmsg

    如果某個(gè)進(jìn)程對(duì)一個(gè)阻塞的TCP套接口調(diào)用這些輸入函數(shù)之一,而且該套接口的接收緩沖區(qū)中沒有數(shù)據(jù)可讀,該進(jìn)程將被投入睡眠,直到到達(dá)一些數(shù)據(jù)。既然 TCP是字節(jié)流協(xié)議,該進(jìn)程的喚醒就是只要到達(dá)一些數(shù)據(jù):這些數(shù)據(jù)既可能是單個(gè)字節(jié),也可以是一個(gè)完整的TCP分節(jié)中的數(shù)據(jù)。如果想等到某個(gè)固定數(shù)目的數(shù)據(jù)可讀為止,可以調(diào)用readn函數(shù),或者指定MSG_WAITALL標(biāo)志。

    既然UDP是數(shù)據(jù)報(bào)協(xié)議,如果一個(gè)阻塞的UDP套接口的接收緩沖區(qū)為空,對(duì)它調(diào)用輸入函數(shù)的進(jìn)程將被投入睡眠,直到到達(dá)一個(gè)UDP數(shù)據(jù)報(bào)。

    對(duì)于非阻塞的套接口,如果輸入操作不能被滿足(對(duì)于TCP套接口即至少有一個(gè)字節(jié)的數(shù)據(jù)可讀,對(duì)于UDP套接口即有一個(gè)完整的數(shù)據(jù)報(bào)可讀),相應(yīng)調(diào)用將立即返回一個(gè)EWOULDBLOCK錯(cuò)誤。

2 輸出操作:write、writev、send、sendto、sendmsg

    對(duì)于一個(gè)TCP套接口,內(nèi)核將從應(yīng)用進(jìn)程的緩沖區(qū)到該套接口的發(fā)送緩沖區(qū)拷貝數(shù)據(jù)。對(duì)于阻塞的套接口,如果其發(fā)送緩沖區(qū)中沒有空間,進(jìn)程將被投入睡眠,直到有空間為止。

    對(duì)于一個(gè)非阻塞的TCP套接口,如果其發(fā)送緩沖區(qū)中根本沒有空間,輸出函數(shù)調(diào)用將立即返回一個(gè)EWOULDBLOCK錯(cuò)誤。如果其發(fā)送緩沖區(qū)中有一些空間,返回值將是內(nèi)核能夠拷貝到該緩沖區(qū)中的字節(jié)數(shù)。這個(gè)字節(jié)數(shù)也稱為不足計(jì)數(shù)(short count)

    UDP套接口不才能在真正的發(fā)送緩沖區(qū)。內(nèi)核只是拷貝應(yīng)用進(jìn)程數(shù)據(jù)并把它沿協(xié)議棧向下傳送,漸次冠以UDP頭部和IP頭部。因此對(duì)一個(gè)阻塞的UDP套接口,輸出函數(shù)調(diào)用將不會(huì)因?yàn)榕cTCP套接口一樣的原因而阻塞,不過有可能會(huì)因其他的原因而阻塞。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

原文鏈接:http://www.cnblogs.com/lidabo/p/6039677.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频一区二区 村上凉子 | 久久精麻豆亚洲AV国产品 | 无码专区aaaaaa免费视频 | 亚洲免费黄色网 | 日韩操片| 国产xx肥老妇视频奂费 | 2022超帅男同gayxxx | 美女gif趴跪式抽搐动态图 | 性欧美f| 久久久久嫩草影院精品 | 国产精品久久久久久久牛牛 | 鬼畜重口高h合集长短篇 | 二次元美女脱裤子让男人桶爽 | 国产成人免费高清激情视频 | 9久热久爱免费精品视频在线观看 | 欧美一级裸片 | 日产精品一卡2卡三卡4乱码久久 | 日本一区二区免费在线观看 | 久久免费看少妇高潮A片特爽 | bdsm酷刑折磨死美女 | 国产亚洲欧美日韩综合综合二区 | 91麻豆精东果冻天美传媒老狼 | 国产精品主播在线 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 欧美美女一区二区三区 | 亚洲国产精品嫩草影院久久 | 国产精品成人va在线观看 | 国产精品免费 | 国产精品俺来也在线观看了 | 国产高清在线看 | 欧美影院一区二区三区 | 亚洲xxxxxhd奶水女人 | 四虎在线精品观看免费 | 动漫美女被吸乳羞羞小说 | 精品国产一级在线观看 | 欧美一区二区日韩一区二区 | 色老太bbbbb| 久久成人精品免费播放 | 天天操天天干天天 | 国产精品天天看特色大片不卡 | 国内亚州视频在线观看 |