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

4

2 回答 2

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

端口不能被重用的原因是端口没有监听——它是一个传出端口。

于 2010-12-09T02:24:20.230 回答
0

难道这两个40006端口在不同的接口上?

于 2010-12-08T22:39:48.563 回答