在 ANSI C 中将套接字绑定到端口 80

8

当我尝试在C中将端口80绑定到套接字时,总是会收到错误提示,即我没有权限使用该端口。是否有一种简单的方法可以获取此权限?

9个回答

17
通常只有超级用户(root)可以绑定到“特权”端口(即那些低于1024的端口号)。
这意味着您要么必须以root身份运行程序,要么使可执行文件为'suid root'。
这两种方法都会产生安全后果,因此您可能希望考虑使用suid方法,并在bind调用完成后放弃超级用户特权。

端口1024及以下实际上被称为“特权端口”,而不是“安全端口”,而1024以上的所有端口都是“临时端口”。干杯。 - oz10

5
你会发现这篇教程对于使用C/C++进行网络编程非常有帮助。
顺便说一下,ANSI C无法访问网络。它是由操作系统提供的库(BSD socket API,也被移植到Windows作为winsock)提供此功能。

Beej的套接字指南是我在大学学习套接字编程的教材,与其他计算机科学专业学生一样。它真的很好。此外,W. Richard Stevens的作品也是这个领域的好教程。 - ConcernedOfTunbridgeWells
是的,尽管阅读Beej的教程比Stevens的圣经要快得多 :-) - Eli Bendersky

3

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

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

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


0

如果您正在使用共享系统(例如大学计算机)且没有root权限,则按设计,没有“简单”的方法可以获得该权限。


0

正如@Charles Bailey所说的那样...我想补充一点,这就是为什么过去在URL中通过端口规范使用8080来显示http服务器地址,例如http://some.url:8080/


0

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


0
S.Lott的回答可能引发了非常负面的反应,但他的想法并不愚蠢:如果原始问题是针对一个真实的程序(而不是学校作业),在HTTP服务器后面开发它作为一个应用程序往往是一个合理的选择。这样,你可以把许多底层细节交给一个好的、经过良好调试的程序Apache。
该应用程序不必是一个CGI,它可以是一个Apache模块。从2版本开始,Apache不再仅仅是一个HTTP服务器,而是一个开发网络程序的平台。编写一个Apache模块可能是对原始问题的正确答案(参见 Apache文档

谢谢。我花了一些时间才理解为什么有特权端口。这与预期有关--您期望在80号端口上使用HTTP协议,并且已经有一个很好的软件来处理该协议。 - S.Lott

0

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

虽然许多人建议以超级用户身份运行,但这是解决此问题的不良方案。如果您正在Debian或Ubuntu系统上运行,则建议安装authbind软件包,它将允许您授予程序打开特权端口的权限,而无需为程序提供任何其他特殊权限。

如果您在其他任何系统上运行,则建议安装Debian或Ubuntu ;-)。


-3

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接