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-サーバー#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:40006listen()

次のプログラムはこれを示しています。

#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

2つの40006ポートが異なるインターフェイス上にあった可能性がありますか?

于 2010-12-08T22:39:48.563 に答える