【问题标题】:Binding a socket to port 80 in ansi c在 ansi c 中将套接字绑定到端口 80
【发布时间】:2010-09-15 05:02:05
【问题描述】:

当我尝试将端口 80 绑定到 c 中的套接字时,我总是收到错误消息,即我无权使用此端口。有没有简单的方法来获得这个权限?

【问题讨论】:

    标签: c networking sockets webserver


    【解决方案1】:

    普通程序无法绑定“特权”端口 - 低于 1024 的端口。这是类 UNIX 操作系统的大部分已过时的安全功能。

    以超级用户身份运行,虽然这里有许多其他人建议,但对于这个问题来说是一个糟糕的解决方案。如果您在 Debian 或 Ubuntu 系统上运行,我建议安装 authbind 软件包,它允许您授予您的程序打开特权端口的权限,而无需实际授予您的程序任何其他特殊权限。

    如果您在任何其他系统上运行,我建议安装 debian 或 ubuntu ;-)。

    【讨论】:

      【解决方案2】:

      S.Lott 的回复可能引发了非常负面的反应,但他的想法远非愚蠢:如果最初的问题是针对实际程序(不是学校作业),将其开发为 HTTP 服务器后面的应用程序通常是合理的选择。这样一来,您就可以将大量低级细节留给经过良好调试的良好程序 Apache。

      应用程序不必是 CGI,它可以是 Apache 模块。从版本 2 开始,Apache 不再只是一个 HTTP 服务器。它现在是一个开发网络程序的平台。编写一个 Apache 模块可能是原始问题的正确答案(请参阅Apache documentation

      【讨论】:

      • 谢谢。我花了一段时间才了解为什么有特权端口。这与期望有关——您期望端口 80 上的 http 协议,并且已经有一个不错的软件可以为您处理该协议。
      【解决方案3】:

      是的,您可以轻松绑定到端口 80。使用 Apache。编写一个网络应用程序。 Apache 绑定到端口 80 并运行您的 Web 应用程序。

      您是否正在尝试编写下一个 Apache?如果是这样,您需要了解操作系统中的setuid API 调用。

      如果您不是在编写新版本的 Apache,大多数人都会使用非特权端口。 8000流行,8080也流行。

      【讨论】:

        【解决方案4】:

        通常只有超级用户 (root) 可以绑定到“特权”端口(即低于 1024 的端口号)。

        这意味着您要么必须以 root 身份运行程序,要么将可执行文件设为“suid root”。

        这两种方法都有安全后果,因此您可能需要考虑使用 suid 方法并在进行绑定调用后放弃超级用户权限。

        【讨论】:

        • 端口 1024 及以下实际上称为“特权端口”而不是“安全端口”,1024 以上的所有端口都是“临时端口”。干杯。
        【解决方案5】:

        1024 及以下端口称为特权端口,绑定到这些端口需要提升权限。

        1024 以上的端口称为临时端口。绑定到这些不需要特殊权限。

        访问特权端口的最简单方法是成为 root 用户。

        【讨论】:

          【解决方案6】:

          传统上只有 root 可以将套接字绑定到 1024 以下的端口。

          【讨论】:

            【解决方案7】:

            正如@Charles Bailey 所说的那样......我想补充一点,这就是为什么人们过去常常在 URL 中按端口规范查看 8080 上的 http 服务器地址为http://some.url:8080强>/

            【讨论】:

              【解决方案8】:

              您会发现this tutorial 对使用 C/C++ 进行网络编程非常有帮助。

              顺便说一句,ANSI C 无法访问网络。提供此功能的是操作系统提供的库(BSD 套接字 API,也以winsock 的形式移植到 Windows)。

              【讨论】:

              • Beej 的套接字指南是我在大学里和其他几代计算机科学专业的学生一起学习的套接字编程。真的很棒。此外,W. Richard Stevens 的作品是该领域的一个很好的教程。
              • 是的,尽管阅读 Beej 的教程比 Stevens 的圣经花费的时间要少得多 :-)
              【解决方案9】:

              如果您使用的是共享系统(如大学计算机)而不是 root,那么设计上就没有“简单”的方法来获得该权限。

              【讨论】:

                猜你喜欢
                • 2021-08-25
                • 2015-12-23
                • 1970-01-01
                • 2016-10-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-01
                • 1970-01-01
                相关资源
                最近更新 更多