我遇到了一个奇怪的偶然事件,我的结果是
lsof | grep 40006
制作
java 29722 appsrv 54u IPv6 71135755 0t0 TCP localhost:40006->localhost:40006 (ESTABLISHED)
一般来说,我看
java 30916 appsrv 57u IPv6 71143812 0t0 TCP localhost:43017->localhost:40006 (ESTABLISHED)
箭头两侧的端口不匹配。虽然lsof产生了前一个结果,但即使套接字配置为SO_REUSEADDR,我也无法启动试图侦听端口40006的应用程序。
这可能发生吗?应该吗?
uname给出:Linux femputer 2.6.32-24-server#39-Ubuntu SMP Wed Jul 28 06:21:40 UTC 2010 x86_64 GNU / Linux
答案 0 :(得分:1)
可以通过创建套接字,将其绑定到127.0.0.1:40006
,然后将connect()
绑定到127.0.0.1:40006
来安排此类连接。 (注意:没有listen()
)。我相信这被称为“积极主动开放”。
以下程序演示了这一点:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main()
{
int s;
struct sockaddr_in sa = {
.sin_family = PF_INET,
.sin_port = htons(40006),
.sin_addr.s_addr = htonl(INADDR_LOOPBACK) };
s = socket(PF_INET, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
return 1;
}
if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("bind");
return 1;
}
if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
perror("connect");
return 1;
}
pause();
return 0;
}
端口无法重用的原因是端口没有侦听 - 它是一个传出端口。
答案 1 :(得分:0)
可能是两个40006
端口位于不同的接口上吗?