8

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

4

9 回答 9

17

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

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

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

于 2008-10-03T22:25:43.883 回答
4

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

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

于 2008-10-03T22:28:36.327 回答
3

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

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

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

于 2008-10-03T22:38:01.003 回答
0

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

于 2008-10-03T22:27:21.883 回答
0

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

于 2008-10-03T22:30:03.720 回答
0

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

于 2008-10-03T22:34:38.233 回答
0

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

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

于 2008-10-04T20:38:45.067 回答
0

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

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

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

于 2008-10-16T12:11:03.670 回答
-3

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

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

如果您不编写新版本的 Apache,大多数人使用非特权端口。8000很受欢迎,8080也很受欢迎。

于 2008-10-03T23:22:28.123 回答