В моем классе сокетов есть этот код:
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>