Winapi Can';t绑定到XP sp3上的低端口号(80)

Winapi Can';t绑定到XP sp3上的低端口号(80),winapi,sockets,winsock,bind,Winapi,Sockets,Winsock,Bind,我的socket类中有以下代码: 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->s

我的socket类中有以下代码:

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”,这甚至不是有效的套接字错误代码。传入的“Port”的值是80,我正在运行一个简单的HTTP服务器作为服务的UI。我不完全确定为什么要检查>=0,但它可能与我也在上面使用此代码的非windows平台有关。在任何情况下,根据MSDN,bind的错误返回码是SOCKET_error,它是-1,因此检查应该是正常的

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


更新:我们刚刚尝试了另一个端口号“8888”,一切正常。因此,似乎低端口号是问题所在。在我们运行我的服务之前,没有任何东西在该端口上进行积极侦听,因此我认为这是SP3中的某种新权限问题,它会停止进程在<1024的端口上进行侦听,除非它们具有某些权限,类似于linux/unix的操作方式。不过我还是希望能把它整理出来。

你在做有趣的指针运算。。。只需在堆栈中放入一个sockaddr_,并向其传递一个要绑定的指针

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)

端口号在0到1023之间,并且操作系统可能需要管理权限才能绑定到这些端口。因此,任何试图使用这些端口的应用程序都必须具有特权。

您真的能以这种方式将真实套接字与WinSock套接字混合使用吗?我认为您的方法应该对socket/bind/listen/使用errno或WSA调用……我很确定您可以混合使用这些调用,我从未见过任何相反的情况。我的代码已经这样工作很长时间了。YMMV请你把问题的最后一段(你的更新)移到一个答案并接受它好吗?这仍然出现在“未答复”名单上。比尔:这是一个变通办法,不是解决办法。这个悬而未决的问题仍然存在,尽管我真的不再关心它了,因为我们正在使用变通方法。我宁愿删除整个问题,然后重新询问是否需要继续。没有任何东西已经在使用端口(我们使用了tcpview),我认为perms是个问题,但是如何“获得”权限perms来打开套接字呢?这是问题的核心。这只是额外的信息。我需要知道的是如何获得这些权限?对于UNIX,程序必须由root和setuid拥有(即,打开setuid位)。我不了解Windows。在Windows上,进程可以通过清单请求管理员权限。然后可以使用小于1024的端口。