【问题标题】:Using getpeername with descriptor as 0使用描述符为 0 的 getpeername
【发布时间】:2013-01-31 03:30:02
【问题描述】:

我得到了这行的旧代码:

getpeername(0, (struct sockaddr *)&sin, &namelen)

getpeername(0,...) 有什么作用? 它适用于所有操作系统? 我试图在 SUN 中编译和运行,我得到了这个 => 非套接字上的套接字操作 我在互联网上做了一些研究,但我不明白为什么我使用这条线,它返回我的“本地主机”?

谢谢

【问题讨论】:

    标签: c++ sockets


    【解决方案1】:

    它寻找文件描述符0的对等点,即网络另一端的主机,即STDIN。

    这可能是一种检查标准输入是否已重定向到套接字的简单方法。这在 inetd 风格的守护进程中很常见:如果它返回一个错误,那么它作为一个普通的守护进程启动,但是如果它成功,那么它作为一个 inetd 守护进程启动,而这个套接字就是用于守护程序操作的套接字。

    【讨论】:

    • 抱歉这个问题,但我如何启动 inetd 风格的守护进程
    • @demonofnight:嗯,要以 inetd 模式启动它,您不必手动启动它,它是由 inetd 守护进程启动的。或者,最近,通过 systemd,IIRC。
    【解决方案2】:

    试试man getpeername。这是一个 POSIX API,因此应该在 UNIX 和 Linux 平台上得到支持。

    第一个参数必须是连接套接字的 fd。它将填写对等方(另一方)的地址。如何使用长度参数的详细信息:参见手册页

    只有 fd 0 (stdin) 绑定到套接字时,您的调用才会起作用。

    这通常是由 inetd 启动的服务器的情况,但您没有告诉我们上下文。

    您可能想要更改标签:这是一个 UNIX 套接字问题,但与 C++ 没有特别的关系。

    【讨论】:

    【解决方案3】:

    您收到该错误是因为文件描述符0 通常是标准输入,而不是套接字。我不确定原作者的意图,但它不应该以它的方式工作。也许有了更多的上下文,我可以为您提供进一步的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多