macos 上的端口绑定

Posted

技术标签:

【中文标题】macos 上的端口绑定【英文标题】:Port binding on macos 【发布时间】:2012-10-03 16:46:58 【问题描述】:

我在java中使用ServerSocket来检查mysql是否正在运行。如果它没有运行,我提示用户请运行你的 mysql 服务器。但是,我的一些用户抱怨虽然 mysql 正在运行,但我们收到了错误消息。它只发生在 macos 中。我发现的是。

Java 代码:

public static boolean isPortFree(int port)

    if(port <= 0)
    
        return false;
    
    ServerSocket sock = null;
    try
    
        String bindAddress = System.getProperty("bindaddress", "127.0.0.1");
        sock = new ServerSocket(port,0,InetAddress.getByName(bindAddress));
    
    catch(Exception ex)
    
        return false;
    
    finally
    
        if (sock != null)
        
            try
            
                sock.close();
            
            catch (Exception e)
            
                e.printStackTrace();
            
        
    
    return true;

如果我将系统属性 bindaddress 设置为 localhost 它返回 false 同样我设置为 127.0.0.1 返回 true 。 localhost , 127.0.0.1 与它的行为相同。它只出现在 macos 中。我认为这不是my.cnf bindaddress 问题。因为我用

签入了命令提示符
 mysql -uroot -hlocalhost
 mysql -uroot -h127.0.0.1

都是作品。

网络统计

MacOS

 tcp4       0      0  *.3306                 *.*                    LISTEN

其他操作系统

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN 

tcp4和tcp有区别吗?

知道为什么会这样吗?

【问题讨论】:

我不明白你为什么首先使用ServerSocket。只需尝试打开Socket 到端口 3306。如果成功,则 MySQL 正在运行。如果没有,就没有。 【参考方案1】:

这两个示例有效地绑定到不同的接口:INADDR_ANY 不会阻止绑定到特定的适配器。

如果在 OSX 上 MySQL 的配置与您报告的“Other Os”完全相同,它将按预期工作。

【讨论】:

以上是关于macos 上的端口绑定的主要内容,如果未能解决你的问题,请参考以下文章

heroku 上的 Hapi 服务器无法绑定端口

Docker:更改已创建容器上的端口绑定而不会丢失数据

我可以将非特权应用程序绑定到 Mac OS X 上的特权端口吗?

install4j 可以用来允许应用程序绑定到特权端口吗?

traefik - 同一主机的多个端口绑定 V2

ESXi6.5使用软件 iSCSI 配置网络连接的最佳做法