【发布时间】:2010-09-15 05:02:05
【问题描述】:
当我尝试将端口 80 绑定到 c 中的套接字时,我总是收到错误消息,即我无权使用此端口。有没有简单的方法来获得这个权限?
【问题讨论】:
标签: c networking sockets webserver
当我尝试将端口 80 绑定到 c 中的套接字时,我总是收到错误消息,即我无权使用此端口。有没有简单的方法来获得这个权限?
【问题讨论】:
标签: c networking sockets webserver
普通程序无法绑定“特权”端口 - 低于 1024 的端口。这是类 UNIX 操作系统的大部分已过时的安全功能。
以超级用户身份运行,虽然这里有许多其他人建议,但对于这个问题来说是一个糟糕的解决方案。如果您在 Debian 或 Ubuntu 系统上运行,我建议安装 authbind 软件包,它允许您授予您的程序打开特权端口的权限,而无需实际授予您的程序任何其他特殊权限。
如果您在任何其他系统上运行,我建议安装 debian 或 ubuntu ;-)。
【讨论】:
S.Lott 的回复可能引发了非常负面的反应,但他的想法远非愚蠢:如果最初的问题是针对实际程序(不是学校作业),将其开发为 HTTP 服务器后面的应用程序通常是合理的选择。这样一来,您就可以将大量低级细节留给经过良好调试的良好程序 Apache。
应用程序不必是 CGI,它可以是 Apache 模块。从版本 2 开始,Apache 不再只是一个 HTTP 服务器。它现在是一个开发网络程序的平台。编写一个 Apache 模块可能是原始问题的正确答案(请参阅Apache documentation)
【讨论】:
是的,您可以轻松绑定到端口 80。使用 Apache。编写一个网络应用程序。 Apache 绑定到端口 80 并运行您的 Web 应用程序。
您是否正在尝试编写下一个 Apache?如果是这样,您需要了解操作系统中的setuid API 调用。
如果您不是在编写新版本的 Apache,大多数人都会使用非特权端口。 8000流行,8080也流行。
【讨论】:
通常只有超级用户 (root) 可以绑定到“特权”端口(即低于 1024 的端口号)。
这意味着您要么必须以 root 身份运行程序,要么将可执行文件设为“suid root”。
这两种方法都有安全后果,因此您可能需要考虑使用 suid 方法并在进行绑定调用后放弃超级用户权限。
【讨论】:
1024 及以下端口称为特权端口,绑定到这些端口需要提升权限。
1024 以上的端口称为临时端口。绑定到这些不需要特殊权限。
访问特权端口的最简单方法是成为 root 用户。
【讨论】:
传统上只有 root 可以将套接字绑定到 1024 以下的端口。
【讨论】:
正如@Charles Bailey 所说的那样......我想补充一点,这就是为什么人们过去常常在 URL 中按端口规范查看 8080 上的 http 服务器地址为http://some.url:8080强>/
【讨论】:
您会发现this tutorial 对使用 C/C++ 进行网络编程非常有帮助。
顺便说一句,ANSI C 无法访问网络。提供此功能的是操作系统提供的库(BSD 套接字 API,也以winsock 的形式移植到 Windows)。
【讨论】:
如果您使用的是共享系统(如大学计算机)而不是 root,那么设计上就没有“简单”的方法来获得该权限。
【讨论】: