我在写 Inetd的克隆 在其中,我必须运行一个服务器,该服务器打印到连接到它的客户端的IP和端口。

当我覆盖时 STDINSTDOUT 使用插座描述符, 我的最初解决方案 这样做是恢复 sockaddr_in 结构,其中包含所需的信息。这样做 getsockname(), 但是,正在返回一个空结构,所有位设置为0。

对我的方法有什么想法吗?我还可以使用其他方法来恢复IP/端口吗?

谢谢

有帮助吗?

解决方案

正如R ..指出的那样,您应该使用 getpeername. 。该功能和 getsockname 以文件描述为第一个参数,而不是流指针(FILE *)。利用 fileno(stdin) 要获取标准输入的文件描述符(或将其硬编码为 STDIN_FILENO, ,因为它是恒定的)。

另外,最后一个论点 getsocknamegetpeername 应该是指向 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));

getsocknamegetpeername 功能为 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().

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top