解决方案
正如R ..指出的那样,您应该使用 getpeername
. 。该功能和 getsockname
以文件描述为第一个参数,而不是流指针(FILE *
)。利用 fileno(stdin)
要获取标准输入的文件描述符(或将其硬编码为 STDIN_FILENO
, ,因为它是恒定的)。
另外,最后一个论点 getsockname
和 getpeername
应该是指向 socklen_t
, ,不是一个常数,您应该使用 sockaddr_in
对于TCP/IP:
struct sockaddr_in peeraddr;
socklen_t peeraddrlen = sizeof(peeraddr);
getpeername(STDIN_FILENO, &peeraddr, &peeraddrlen);
见一个完整的示例 这里.
其他提示
利用 getpeername
. 。我怀疑你的问题是 getsockname
正在返回套接字的(本地)侧的信息,该信息可能约为0.0.0.0(这意味着它可以接受任何接口的连接)。
编辑: 我想我发现您正在阅读代码的实际错误。这条线是错误的:
getsockname(stdin, &addr, sizeof(addr));
这 getsockname
和 getpeername
功能为 socklen_t *
(一个 指针)作为他们的第三个论点,不是 size_t
. 。编译器应该告诉您这个错误 getsockname
. 。另外,正如已经说过的那样 stdin
是不正确的。尝试:
socklen_t len = sizeof addr;
getpeername(0, &addr, &len);
或(仅C99):
getpeername(0, &addr, (socklen_t[1]){sizeof addr});
您还应该检查退货值;如果这样做,您会发现它正在返回错误。
如果您需要远程客户端的这些信息,则必须致电 getPeername().
不隶属于 StackOverflow