传出TCP端口匹配监听端口
我遇到一个奇怪的偶然事件,其中的我传出TCP端口匹配监听端口
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正在生成前一个结果,但我无法启动尝试侦听端口40006的应用程序,即使套接字配置为SO_REUSEADDR。
这可能发生吗?应该是?
UNAME给出:Linux的femputer 2.6.32-24服务器#39,Ubuntu的SMP周三7月28日6点21分40秒UTC 2010 x86_64的GNU/Linux的
可以通过创建套接字来安排这种连接,将其绑定到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;
}
的原因,不能再使用的端口是因为口不听 - 这是一个输出端口。
难道这两个端口40006
分别在不同的接口?
计算机上只有一个接口。 – user535674 2010-12-08 23:35:20
除非在lo和eth0之间做出区分,因为这两个应用程序都位于同一台计算机上,并通过主机名localhost进行连接。 – user535674 2010-12-08 23:37:24
注意:对于第一个lsof结果,在40006上监听的应用程序已终止。 – user535674 2010-12-08 22:36:00