Не удается связать с низким номером порта (80) на XP sp3 - PullRequest
1 голос
/ 05 мая 2009

В моем классе сокетов есть этот код:

bool GSocket::Listen(int Port)
{
    d->Socket = socket(AF_INET, SOCK_STREAM, 0);
    if (d->Socket >= 0)
    {
        sockaddr Addr;
        sockaddr_in *a = (sockaddr_in*) &Addr;
        ZeroObj(Addr);
        a->sin_family = AF_INET;
        a->sin_port = htons(Port);
        a->sin_addr.OsAddr = INADDR_ANY;

        if (bind(d->Socket, &Addr, sizeof(Addr)) >= 0)
        {
            if (listen(d->Socket, SOMAXCONN) != SOCKET_ERROR)
            {
                return true;
            }
            else
            {
                Error();
            }
        }
        else
        {
            Error();
        }
    }
    else
    {
        Error();
    }

    return false;
}

Метод «Error ()» просто вызывает WSAGetLastError и передает ошибку и ее описание в приложение. В любом случае, он отлично работает на моей машине (xp sp2), но не работает на моей машине xp sp3. В частности, происходит сбой вызова связывания, и WSAGetLastError возвращает «2», что даже не является допустимым кодом ошибки сокета. Передаваемое значение «Порт» равно 80, я использую простой HTTP-сервер в качестве пользовательского интерфейса для службы. Я не совсем уверен, почему я проверяю для> = 0, но это может быть связано с не-Windows платформами, на которых я также использую этот код. В любом случае, в соответствии с MSDN, код возврата ошибки для связывания - SOCKET_ERROR, равный -1, поэтому проверка должна быть в порядке.

Я что-то упустил?

Обновление: мы только что попробовали другой номер порта '8888', и все работает как положено. Таким образом, кажется, что низкий номер порта является проблемой. Нет ничего, что активно прослушивает этот порт до того, как мы запустим мой сервис, поэтому я думаю, что это какая-то новая проблема с разрешениями в SP3, которая останавливает процессы, прослушивающие порты <1024, если у них нет определенных разрешений, аналогично способу linux / unix делать вещи. Тем не менее, я все равно хотел бы разобраться. </p>

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Номера портов в диапазоне от 0 до 1023 являются хорошо известными портами , и операционной системе могут потребоваться права администратора для привязки к ним. Следовательно, любое приложение, которое пытается использовать эти порты, должно быть привилегированным.

0 голосов
/ 06 мая 2009

Вы делаете забавную арифметику с указателями ... просто поместите sockaddr_in в стек и передайте указатель на него для привязки.

sockaddr_in a = {0};
a.sin_family = AF_INET;
a.sin_port = htons(Port);
a.sin_addr.OsAddr = INADDR_ANY;

if (bind(d->Socket, (sockaddr *) &a, sizeof(a)) >= 0)

Кроме того, попробуйте проверить, не мешают ли привилегии. Есть ли что-то уже открытое на этом порту (спросите netstat)

...