【问题标题】:Can't bind to low port number (80) on XP sp3无法绑定到 XP sp3 上的低端口号 (80)
【发布时间】:2010-07-22 02:28:37
【问题描述】:

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

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 中的某种新权限问题,它会停止监听端口

【问题讨论】:

  • 你真的可以这样混合真正的套接字和 WinSock 套接字吗?我原以为您的方法应该使用 errno 或 WSA 调用 socket/bind/listen/...
  • 我很确定你可以混合通话,我从未见过相反的情况。我的代码已经这样工作了很长时间了。 YMMV
  • 您能否将问题的最后一段(您的更新)移至答案并接受它?这仍然显示在“未答复”列表中。谢谢。
  • Bill:这是一种解决方法,而不是解决方案。悬而未决的问题仍然存在,尽管我不再关心它,因为我们正在使用解决方法。我宁愿删除整个问题并重新询问是否需要跟踪。

标签: winapi sockets winsock bind


【解决方案1】:

从 0 到 1023 范围内的端口号是 well known ports,操作系统可能需要管理权限才能绑定到它们。因此,任何尝试使用这些端口的应用程序都必须获得特权。

【讨论】:

  • 这只是额外的信息。我需要知道的是如何获得这些权限?
  • 对于 UNIX,程序必须由 root 和 setuid 拥有(即,打开 set-UID 位)。我不了解 Windows。
  • 在 Windows 上,进程可以通过清单请求管理员权限。然后你可以使用端口
【解决方案2】:

你正在做有趣的指针运算......只需将一个 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)

【讨论】:

  • 没有任何东西正在使用该端口(我们使用了 tcpview),我认为 perms 是问题所在,但是如何“获取”权限 perms 以打开套接字?这就是问题的关键。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2015-12-23
  • 1970-01-01
  • 2020-04-19
  • 2012-05-08
相关资源
最近更新 更多