我有一行旧代码:
getpeername(0, (struct sockaddr *)&sin, &namelen)
getpeername(0,...)
做了什么?
它适用于所有操作系统?
我试图编译并在SUN中运行,我得到这个=>非套接字上的套接字操作
我在互联网上做了一些研究,但我不明白为什么我使用这一行,它返回我的“localhost”?
由于
答案 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
通常是标准输入,而不是套接字。我不确定原作者的意图,但它不应该按照它的方式工作。也许有了更多的背景,我可以帮助你。