国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

onBufferFull被調(diào)用后,怎么停止send???

luckyrin

手冊(cè)原文:
**每個(gè)連接都有一個(gè)單獨(dú)的應(yīng)用層發(fā)送緩沖區(qū),緩沖區(qū)大小由TcpConnection::$maxSendBufferSize決定,默認(rèn)值為1MB,可以手動(dòng)設(shè)置更改大小,更改后會(huì)對(duì)所有連接生效。

該回調(diào)在應(yīng)用層發(fā)送緩沖區(qū)數(shù)據(jù)全部發(fā)送完畢后觸發(fā)。一般與onBufferFull配合使用,例如在onBufferFull時(shí)停止向?qū)Χ死^續(xù)send數(shù)據(jù),在onBufferDrain恢復(fù)寫入數(shù)據(jù)。**

具體怎么實(shí)現(xiàn)以上邏輯????

4085 1 0
1個(gè)回答

walkor 打賞

停止send邏輯要自己想,各個(gè)場(chǎng)景方法可能不一樣。

比如發(fā)現(xiàn)onBufferFull了,給這個(gè)連接弄個(gè)緩沖區(qū)已滿的標(biāo)識(shí),當(dāng)要給這個(gè)連接send數(shù)據(jù)前,判斷下這個(gè)標(biāo)記,如果標(biāo)記為滿不再調(diào)用send發(fā)送,而是把數(shù)據(jù)者保存在磁盤里(或者直接丟棄),等onBufferDrain時(shí)從磁盤中讀取,然后再send給對(duì)方。
有點(diǎn)類似這個(gè)例子:
http://wenda.workerman.net/question/869
再比如workerman作為tcp代理時(shí),A->Workerman->B這種,當(dāng)B的緩沖區(qū)onBufferFull時(shí),可以利用pauseRecv停止對(duì)A的讀,這樣不會(huì)再有數(shù)據(jù)發(fā)送給B,也就不會(huì)調(diào)用send。

這個(gè)可以參考workerman的 http://doc.workerman.net/tcp-connection/pipe.html 寫法,
Workerman/Connection/TcpConnection.php

public function pipe($dest)
{
    $source              = $this;
    $this->onMessage     = function ($source, $data) use ($dest) {
        $dest->send($data);
    };
    $this->onClose       = function ($source) use ($dest) {
        $dest->destroy();
    };
    $dest->onBufferFull  = function ($dest) use ($source) {
        $source->pauseRecv();
    };
    $dest->onBufferDrain = function ($dest) use ($source) {
        $source->resumeRecv();
    };
}
  • luckyrin 2016-04-01

    多謝指點(diǎn)!我好好研究研究!

年代過于久遠(yuǎn),無法發(fā)表回答
??