1

我的套接字类中有这段代码:

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 服务器作为服务的 UI。我不完全确定为什么要检查 >= 0,但它可能与我也使用此代码的非 Windows 平台有关。在任何情况下,根据 MSDN,绑定错误的返回码是 SOCKET_ERROR,它是 -1,因此检查应该没问题。

我错过了一些简单的事情吗?

更新:我们刚刚尝试了一个不同的端口号“8888”,一切都按预期工作。所以看起来低端口号是问题所在。在我们运行我的服务之前,该端口上没有任何主动监听,所以我认为这是 SP3 中的某种新权限问题,它会停止监听端口 < 1024 的进程,除非它们具有某些权限,类似于 linux/unix 方式的做事。无论如何,我仍然希望能够解决它。

4

2 回答 2

2

0 到 1023 范围内的端口号是众所周知的端口,操作系统可能需要管理权限才能绑定到它们。因此,任何尝试使用这些端口的应用程序都必须具有特权。

于 2010-07-21T18:28:37.913 回答
0

您正在那里进行有趣的指针运算...只需将 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)

于 2009-05-06T04:15:05.543 回答