Solaris - мой процесс прослушивает все интерфейсы, но другие процессы прослушивают localhost: 6011 - PullRequest
1 голос
/ 29 сентября 2011

Моя серверная программа предназначена для прослушивания на всех интерфейсах, и она также работает, слушая.

Происходит одно странное поведение. Это означает конфликт портов с процессом sshd. Потому что мне нужно, чтобы мое приложение и sshd прослушивали один и тот же диапазон портов (например: 6000 - 6100)

Код MyProg:

   MyPort = 6011;

   #if TARGET_HAS_IPV6_SUPPORT

   /* IPv6 socket */
   {

        struct addrinfo *ai = NULL;

        r = ipw_getaddrinfo("::", NULL, AF_INET6, SOCK_STREAM, IPPROTO_TCP, AI_PASSIVE, &ai);
        if (r == 0)
        {
          Create_listen_socket(&ai, IpcMyPort);
        }
    }
   #endif

    {
        struct addrinfo ailocal = { 0 };
        struct sockaddr_in sin = { 0 };

        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        ailocal.ai_family = AF_INET;
        ailocal.ai_socktype = SOCK_STREAM;
        ailocal.ai_protocol = IPPROTO_TCP;
        ailocal.ai_flags = AI_PASSIVE;
        ailocal.ai_addrlen = sizeof(struct sockaddr_in);
        ailocal.ai_addr = (struct sockaddr *)&sin;
        Create_listen_socket(&ailocal, MyPort);
    }


Create_listen_socket(struct addrinfo *ai,
                     unsigned int MyPort)
{

    SOCKET fd = INVALID_SOCKET;

    while (ai != NULL)
    {
        fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
            if (fd == INVALID_SOCKET)
            {
                Exit()
                break;
            }

            switch (switch (sa->sa_family)
            {
                case AF_INET:
                {
                    struct sockaddr_in *sin = (struct sockaddr_in *)sa;
                    sin->sin_port = htons((unsigned short)port);
                }
                break;

                #if TARGET_HAS_IPV6_SUPPORT 
                case AF_INET6:
                {
                    struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
                    sin6->sin6_port = htons((unsigned short)port);
                }
                break;

                #endif 
            }

            if (ipw_bind(fd, ai->ai_addr, ai->ai_addrlen) < 0)
            {

               exit();
               Break;
            }
            else
            {

                r = ipw_listen(fd, IPC_MAX_LISTEN_COUNT);
             }

        ai = ai->ai_next;
    }
}

Ниже выводится "sudo lsof -i -P | grep: 60"


:: :: ::

sshd 23038 fin22495 11u IPv4 0x60026f7c740 0t0 TCP localhost: 6011 (СЛУШАТЬ)

myProg 23108 root 4u IPv6 0x60026e46000 0t0 TCP *: 6011 (СЛУШАТЬ)

myProg 23108 root 5u IPv4 0x6002658e3c0 0t0 TCP *: 6011 (СЛУШАТЬ)


Если вы видите, демон sshd прослушивает тот же порт 6011, но на локальном интерфейсе хоста. но моя программа слушает * .6011.

Как убедиться, что myProg прослушивает «localhost: 6011» вместе с *: 6011, и, если какой-то процесс уже прослушивает «localhost: 6011», как его обнаружить. Это происходит в Солярисе.

Пожалуйста, дайте мне знать ваши взгляды.

Спасибо, Naga

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Я не уверен, что вы сделали здесь, потому что sshd обычно должен прослушивать порт 22, а не 6011. Первый процесс, открывающий порт, получит монопольный доступ.Для этого есть веские причины, связанные с безопасностью.Для получения дополнительной информации см. Справочную страницу tcp (7P) - ищите SO_REUSEADDR и SO_EXECLBIND.

0 голосов
/ 30 сентября 2011

Если вы видите, демон sshd прослушивает тот же порт 6011, но на локальном интерфейсе хоста.но моя программа прослушивает * .6011.

Как убедиться, что myProg прослушивает «localhost: 6011» вместе с *: 6011 и, если какой-то процесс уже прослушивает «localhost: 6011», как его обнаружить,Это происходит в Solaris.

Номера портов вашего приложения конфликтуют с портами, используемыми ssh X-forwarding.Измените свои номера портов и покончите с этим.

...