【问题标题】:What's the correct answer about getservbyname?关于 getservbyname 的正确答案是什么?
【发布时间】:2018-07-07 15:58:26
【问题描述】:

我不知道关于 getservbyname 的正确答案是什么。

句子sp = getservbyname("example", "tcp")

一个。被客户端用来获取服务的端口。

b.只有在我们有权修改 /etc/services 文件时才能使用。

c。如果我们可以访问 /etc/services,服务器将使用它来获取服务的端口。

d。 a y b 是正确的。

非常感谢!

【问题讨论】:

  • 你想测试我们吗? reading the documentation 怎么样?
  • 我已经读过了。我有一个关于这个的考试,我找不到答案。
  • 我们通常拒绝帮助人们完成家庭作业或备考。我在这种情况下写了一个答案,因为考试问题本身需要揭穿:所有四种可能性都是错误的。
  • (您可以就您的课程作业提出问题,只要它们本身就是好问题 - 请参阅 help center 的建议,了解如何为本网站编写好问题 - 只要它似乎您并没有要求我们为您完成所有工作。如果您让其他人为您完成所有工作,您将学不到任何东西。)

标签: c linux sockets


【解决方案1】:

所有的可能性都是错误的。这是一道不好的考试题,你可以告诉你的导师我说过。

(a) 是错误最少的答案。 getservbyname 可以被通用 TCP 客户端用来确定要连接到服务器的哪个端口,给定一个文本服务名称。但是,它还有其他几种用途,而且也已过时:新程序应该使用getaddrinfo(它同时完成getservbyname 的工作和gethostbyname 的工作,同时更灵活)。

(b) 完全错误。 getservbyname 可能需要读取访问/etc/services,这取决于Name Service Switch的配置方式;在任何情况下,它都不需要对该文件的 write 访问权限。 (/etc/services 的内容由IANA service name and port number registry 定义,现在唯一应该修改该文件的程序是系统管理员的文本编辑器和操作系统的包管理器。我不记得是否有曾经是用于更新该文件的 C 库接口,但如果它存在,它将比 getservbyname 更加过时。)

(c) 部分错误;服务器可以合理地使用getservbyname来查找它应该绑定到的端口,但是,如上所述,它最多需要读取访问@ 987654341@ 这样做。 (在选项(b)中说“修改许可”,然后在(c)中只说“访问”是草率的问题写作技巧。)

(d) 是错误的,因为 (b) 是错误的。

【讨论】:

  • 我检查了 Fedora 27 上的 getservbyname(3) 手册页。手册页似乎没有提到该功能已过时或已弃用。事实上,文档说该函数符合 Posix,因此它可能会持续很长时间。这是一个类似的手册页,但有一些遗漏。例如,链接的手册页没有列出 Posix.1-2008:getservbyname(3)
  • @jww:最可靠和最新的手册页位于Linux man-pages project,其中列出了getservbyname(3) 的POSIX.1-2008。虽然getservbyname() 并没有被 POSIX.1 淘汰,因为很多现有代码仍在使用它,但 getaddrinfo()/getnameinfo() 是 POSIX.1 中用于互联网地址和服务解析的正确推荐接口。
  • 也就是说,例如上的措辞。 services(5) 很差.. 它确实应该建议使用 getaddrinfo() 代替。可能值得sending a RFC patch/suggestion
  • @jww 事实上,正如 Nominal Animal 所说,POSIX 并没有正式废弃/弃用该功能(如果是的话,我会这样说),但非正式地说,当新程序应该使用其他东西时,我认为“过时”是一个公平的说法。
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多