将getpeername与描述符一起使用为0

时间:2013-01-30 19:20:30

标签: c++ sockets

我有一行旧代码:

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

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

由于

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

第一个参数必须是连接套接字的fd。它将填写对等方的地址(另一方)。有关如何使用length参数的详细信息:请参阅man-page

如果fd 0(stdin)绑定到套接字,则您的呼叫将起作用。

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

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

答案 2 :(得分:0)

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