我需要在Java应用程序中找到一个自由端口.为什么以下代码不起作用?它总是返回0.
public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}
Run Code Online (Sandbox Code Playgroud)
Java doc new InetSocketAddress()说:
创建一个套接字地址,其中IP地址是通配符地址,端口号是指定值.
有效端口值介于0和65535之间.端口号为零将使系统在绑定操作中获取临时端口.
我正试图让机器的IP成为我一直在聆听的套接字.打印的端口号工作正常,但地址为"0.0.0.0".这是相关的代码.res已经传递到此代码之前getaddrinfo和getsockname之前.
char ip[INET_ADDRSTRLEN];
struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
void* addr = &(ipv4->sin_addr);
inet_ntop(res->ai_family, addr, ip, sizeof ip);
std::cout << "SERVER_ADDRESS " << ip << std::endl;
std::cout << "SERVER_PORT " << ipv4->sin_port << std::endl;
Run Code Online (Sandbox Code Playgroud)
可能有什么不对?
我很好奇是否可以将UNIX套接字映射到INET套接字.情况很简单,我想连接到MySQL服务器.不幸的是它禁用了INET套接字,因此我只能连接UNIX套接字.我正在使用/写入的工具必须连接在INET套接字上,所以我试图看看是否可以将一个映射到另一个.
这需要相当多的搜索,但我确实找到了socat,据说它正在寻找我正在寻找的东西.我想知道是否有人对如何实现这一点有任何建议.我一直在使用的命令行(部分成功)是:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
Run Code Online (Sandbox Code Playgroud)
现在我可以建立连接并与服务器通信.不幸的是,任何尝试进行多个连接都会失败,因为我需要使用fork选项,但是这个选项似乎使连接无法正常运行.
我知道我可以用Perl(我的首选语言)来解决这个问题,但我宁愿避免自己编写整个实现.我熟悉IO :: Socket库,我只是希望有人有这方面的经验.对建议/想法持开放态度.
谢谢.
inet-socket ×3
c ×1
c++ ×1
ip-address ×1
java ×1
javadoc ×1
mysql ×1
perl ×1
port ×1
socat ×1
sockets ×1
unix-socket ×1