3

我得到了这行的旧代码:

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

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

谢谢

4

3 回答 3

3

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

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

于 2013-01-30T19:30:02.007 回答
0

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

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

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

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

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

于 2013-01-30T19:28:58.253 回答
0

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

于 2013-01-30T19:29:02.473 回答