(udp)能不能使用監(jiān)聽(tīng)的端口發(fā)消息?比如監(jiān)聽(tīng)udp,4778,向其他服務(wù)器主動(dòng)發(fā)消息時(shí),也用4778發(fā)出.
我測(cè)試的是不可以的,使用reusePort也不行,我的寫(xiě)法如下:
$a = new Worker(xxx:4778);
$a->reusePort = true;
$a->onWorkerStart = function(){
$opts = ;
$n = new AsyncUdpConnection('udp://xxx:x',$opts);//其他udp連接
$n->reusePort = true;
$n->connect();
};
是這樣類(lèi)似寫(xiě)法,當(dāng)我發(fā)起新連接時(shí),都會(huì)告訴我 already in use,
及時(shí)我新發(fā)起的連接不使用監(jiān)聽(tīng)的端口,比如"bind_to"=>47781,這次連接會(huì)以47781發(fā)起,但是如果我繼續(xù)用相同的配置再次發(fā)起連接,又會(huì)告訴我already in use.
我的系統(tǒng)是centos7,php72,yum安裝并更新.
?
是哪里操作不對(duì)還是怎樣.
或者有沒(méi)有其他任何方法實(shí)現(xiàn):我跟別人建立的連接也是我所監(jiān)聽(tīng)的連接,
如果workerman,那么有沒(méi)有底層的方法可以實(shí)現(xiàn).
給個(gè)思路,關(guān)鍵字都可以,
(當(dāng)然,關(guān)于reusePort,根據(jù)手冊(cè)的用法是可以,同時(shí)監(jiān)聽(tīng).我這里需要發(fā)起新的連接)
最近又繼續(xù)研究這個(gè),發(fā)現(xiàn)
stream_socket_server和stream_socket_cliect
兩個(gè)基本的流操作函數(shù),server可以開(kāi)啟多個(gè)監(jiān)聽(tīng),client不能有任何沖突,使用socket那一套也一樣,所以reusePort的參數(shù)并不能用.
目前仍在研究,如果有人能在不用swoole的情況下實(shí)現(xiàn)這點(diǎn),請(qǐng)?jiān)诖烁?
問(wèn)題已解決,
可以實(shí)現(xiàn)在同一端口上,既監(jiān)聽(tīng),又發(fā)送.
思路如下:
監(jiān)聽(tīng)2222端口,
當(dāng)需要發(fā)送時(shí),取消監(jiān)聽(tīng)2222端口,
使用2222端口發(fā)消息
發(fā)完消息重新監(jiān)聽(tīng)2222端口
?
注意:
不要再主進(jìn)程監(jiān)聽(tīng)2222,
比如,不要直接new worker('XXX:2222')
這樣在這個(gè)worker的回調(diào)里取消監(jiān)聽(tīng)的只是子進(jìn)程的socket,主進(jìn)程仍然在監(jiān)聽(tīng),所以還是無(wú)法占用這個(gè)端口發(fā)送消息.
主進(jìn)程應(yīng)當(dāng) 不堅(jiān)挺任何端口,在主進(jìn)程的onworkerstart里啟動(dòng)監(jiān)聽(tīng),這樣監(jiān)聽(tīng)端口的進(jìn)程和發(fā)消息的進(jìn)程都是有主進(jìn)程控制的,這時(shí)就能有效.