macos上的端口绑定

时间:2012-10-03 16:46:59

标签: java sockets osx-server

我在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

两者都有效。

用netstat

Mac系统

 tcp4       0      0  *.3306                 *.*                    LISTEN

其他Os

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN 

tcp4和tcp之间有什么区别吗?

任何想法为什么会发生?

1 个答案:

答案 0 :(得分:0)

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

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