Исходящий TCP-порт совпадает с портом прослушивания - PullRequest
2 голосов
/ 09 декабря 2010

Я столкнулся со странным случаем, когда результаты моего

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 Ср 28 июля 06:21:40 UTC 2010 x86_64 GNU / Linux

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Можно организовать такое соединение, создав сокет, привязав его к 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;
}

Причина, по которой порт не может быть повторно использован, состоит в том, что порт непрослушивание - это исходящий порт.

0 голосов
/ 09 декабря 2010

Может ли быть так, что два порта 40006 были на разных интерфейсах?

...