首页 文章

传出TCP端口与侦听端口匹配

提问于
浏览
2

我遇到了一个奇怪的偶然事件,我的结果

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

2 回答

  • 1

    可以通过创建套接字来安排这样的连接,将其绑定到 127.0.0.1:40006 ,然后将 connect() 绑定到 127.0.0.1:40006 . (注意:没有 listen() ) . 我相信这被称为"active-active open" .

    以下程序演示了这一点:

    #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;
    }
    

    端口无法重用的原因是端口没有侦听 - 它是一个传出端口 .

  • 0

    可能是两个 40006 端口在不同的接口上?

相关问题