传出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的

+0

注意:对于第一个lsof结果,在40006上监听的应用程序已终止。 – user535674 2010-12-08 22:36:00

可以通过创建套接字来安排这种连接,将其绑定到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分别在不同的接口?

+0

计算机上只有一个接口。 – user535674 2010-12-08 23:35:20

+0

除非在lo和eth0之间做出区分,因为这两个应用程序都位于同一台计算机上,并通过主机名localhost进行连接。 – user535674 2010-12-08 23:37:24