【发布时间】:2013-01-31 03:30:02
【问题描述】:
我得到了这行的旧代码:
getpeername(0, (struct sockaddr *)&sin, &namelen)
getpeername(0,...) 有什么作用?
它适用于所有操作系统?
我试图在 SUN 中编译和运行,我得到了这个 => 非套接字上的套接字操作
我在互联网上做了一些研究,但我不明白为什么我使用这条线,它返回我的“本地主机”?
谢谢
【问题讨论】:
我得到了这行的旧代码:
getpeername(0, (struct sockaddr *)&sin, &namelen)
getpeername(0,...) 有什么作用?
它适用于所有操作系统?
我试图在 SUN 中编译和运行,我得到了这个 => 非套接字上的套接字操作
我在互联网上做了一些研究,但我不明白为什么我使用这条线,它返回我的“本地主机”?
谢谢
【问题讨论】:
它寻找文件描述符0的对等点,即网络另一端的主机,即STDIN。
这可能是一种检查标准输入是否已重定向到套接字的简单方法。这在 inetd 风格的守护进程中很常见:如果它返回一个错误,那么它作为一个普通的守护进程启动,但是如果它成功,那么它作为一个 inetd 守护进程启动,而这个套接字就是用于守护程序操作的套接字。
【讨论】:
试试man getpeername。这是一个 POSIX API,因此应该在 UNIX 和 Linux 平台上得到支持。
第一个参数必须是连接套接字的 fd。它将填写对等方(另一方)的地址。如何使用长度参数的详细信息:参见手册页
只有 fd 0 (stdin) 绑定到套接字时,您的调用才会起作用。
这通常是由 inetd 启动的服务器的情况,但您没有告诉我们上下文。
您可能想要更改标签:这是一个 UNIX 套接字问题,但与 C++ 没有特别的关系。
【讨论】:
您收到该错误是因为文件描述符0 通常是标准输入,而不是套接字。我不确定原作者的意图,但它不应该以它的方式工作。也许有了更多的上下文,我可以为您提供进一步的帮助。
【讨论】: