在《socket數(shù)據(jù)的接納和發(fā)送》一節(jié)中講到,可以運(yùn)用 write()/send() 函數(shù)發(fā)送數(shù)據(jù),運(yùn)用 read()/recv() 函數(shù)接納數(shù)據(jù),本節(jié)就來看看數(shù)據(jù)是若何傳遞的。
成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)一個展示的機(jī)會來證明自己,這并不會花費(fèi)您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。每一個 socket 被創(chuàng)立后,都邑分派兩個緩沖區(qū),輸出緩沖區(qū)和輸入緩沖區(qū)。
write()/send() 并不立刻向收集中傳輸數(shù)據(jù),而是先將數(shù)據(jù)寫入緩沖區(qū)中,再由TCP協(xié)定將數(shù)據(jù)從緩沖區(qū)發(fā)送到目的機(jī)械。一旦將數(shù)據(jù)寫入到緩沖區(qū),函數(shù)就可以勝利前往,不論它們有沒有抵達(dá)目的機(jī)械,也不論它們何時被發(fā)送到收集,這些多是TCP協(xié)定擔(dān)任的工作。
TCP協(xié)定自力于 write()/send() 函數(shù),數(shù)據(jù)有能夠剛被寫入緩沖區(qū)就發(fā)送到收集,也能夠在緩沖區(qū)中不時積存,屢次寫入的數(shù)據(jù)被一次性發(fā)送到收集,這取決于事先的收集狀況、以后線程能否閑暇等諸多要素,不由程序員掌握。
read()/recv() 函數(shù)也是如斯,也從輸出緩沖區(qū)中讀取數(shù)據(jù),而不是直接從收集中讀取。
圖:TCP套接字的I/O緩沖區(qū)表示圖
這些I/O緩沖區(qū)特征可整頓如下:
I/O緩沖區(qū)在每一個TCP套接字中獨(dú)自存在;
I/O緩沖區(qū)在創(chuàng)立套接字時主動生成;
即便封閉套接字也會持續(xù)傳送輸入緩沖區(qū)中遺留的數(shù)據(jù);
封閉套接字將喪失輸出緩沖區(qū)中的數(shù)據(jù)。
輸出輸入緩沖區(qū)的默許巨細(xì)普通多是 8K,可以經(jīng)過 getsockopt() 函數(shù)獲?。?/p>
unsigned optVal; int optLen = sizeof(int); getsockopt(servSock, SOL_SOCKET, SO_SNDBUF, (char*)&optVal, &optLen); printf("Buffer length: %d\n", optVal);
運(yùn)轉(zhuǎn)后果:
Buffer length: 8192
這里僅給出示例,前面會具體解說。
關(guān)于TCP套接字(默許狀況下),當(dāng)運(yùn)用 write()/send() 發(fā)送數(shù)據(jù)時:
1) 起首會反省緩沖區(qū),假如緩沖區(qū)的可用空間長度小于要發(fā)送的數(shù)據(jù),那么 write()/send() 會被壅塞(暫停履行),直到緩沖區(qū)中的數(shù)據(jù)被發(fā)送到目的機(jī)械,騰出足夠的空間,才叫醒 write()/send() 函數(shù)持續(xù)寫入數(shù)據(jù)。
2) 假如TCP協(xié)定正在向收集發(fā)送數(shù)據(jù),那么輸入緩沖區(qū)會被鎖定,不許可寫入,write()/send() 也會被壅塞,直到數(shù)據(jù)發(fā)送終了緩沖區(qū)解鎖,write()/send() 才會被叫醒。
3) 假如要寫入的數(shù)據(jù)大于緩沖區(qū)的大長度,那么將分批寫入。
4) 直到一切數(shù)據(jù)被寫入緩沖區(qū) write()/send() 才干前往。
當(dāng)運(yùn)用 read()/recv() 讀取數(shù)據(jù)時:
1) 起首會反省緩沖區(qū),假如緩沖區(qū)中無數(shù)據(jù),那么就讀取,不然函數(shù)會被壅塞,直到收集上無數(shù)據(jù)到來。
2) 假如要讀取的數(shù)據(jù)長度小于緩沖區(qū)中的數(shù)據(jù)長度,那么就不克不及一次性將緩沖區(qū)中的一切數(shù)據(jù)讀出,殘剩數(shù)據(jù)將不時積存,直到有 read()/recv() 函數(shù)再次讀取。
3) 直到讀取到數(shù)據(jù)后 read()/recv() 函數(shù)才會前往,不然就不斷被壅塞。
這就是TCP套接字的壅塞形式。所謂壅塞,就是上一步舉措沒有完成,下一步舉措將暫停,直到上一步舉措完成后才干持續(xù),以堅(jiān)持同步性。
TCP套接字默許狀況下是壅塞形式,也是最常用的。當(dāng)然你也可以更改為非壅塞形式,后續(xù)我們會解說。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:socket緩沖區(qū)以及壅塞形式-創(chuàng)新互聯(lián)
當(dāng)前地址:http://www.rwnh.cn/article4/isooe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、面包屑導(dǎo)航、App開發(fā)、動態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容