(udp)能不能使用监听的端口发消息?比如监听udp,4778,向其他服务器主动发消息时,也用4778发出.

augushong

(udp)能不能使用监听的端口发消息?比如监听udp,4778,向其他服务器主动发消息时,也用4778发出.
我测试的是不可以的,使用reusePort也不行,我的写法如下:

$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();
};

是这样类似写法,当我发起新连接时,都会告诉我 already in use,
及时我新发起的连接不使用监听的端口,比如"bind_to"=>47781,这次连接会以47781发起,但是如果我继续用相同的配置再次发起连接,又会告诉我already in use.
我的系统是centos7,php72,yum安装并更新.
 
是哪里操作不对还是怎样.
或者有没有其他任何方法实现:我跟别人建立的连接也是我所监听的连接,
如果workerman,那么有没有底层的方法可以实现.
给个思路,关键字都可以,
(当然,关于reusePort,根据手册的用法是可以,同时监听.我这里需要发起新的连接)

4336 2 0
2个回答

augushong

最近又继续研究这个,发现
stream_socket_server和stream_socket_cliect
两个基本的流操作函数,server可以开启多个监听,client不能有任何冲突,使用socket那一套也一样,所以reusePort的参数并不能用.
目前仍在研究,如果有人能在不用swoole的情况下实现这点,请在此更新.

  • 暂无评论
augushong

问题已解决,
可以实现在同一端口上,既监听,又发送.
思路如下:
监听2222端口,
当需要发送时,取消监听2222端口,
使用2222端口发消息
发完消息重新监听2222端口
 
注意:
不要再主进程监听2222,
比如,不要直接new worker('XXX:2222')
这样在这个worker的回调里取消监听的只是子进程的socket,主进程仍然在监听,所以还是无法占用这个端口发送消息.
主进程应当 不坚挺任何端口,在主进程的onworkerstart里启动监听,这样监听端口的进程和发消息的进程都是有主进程控制的,这时就能有效.

  • 暂无评论
年代过于久远,无法发表回答
🔝