getpeername 子例程

用途

获取对等套接字的名称。

标准 C 库 (libc.a)

语法

#include <sys/socket.h>
int getpeername ( Socket,  Name,  NameLength)
int Socket;
struct sockaddr *Name;
socklen_t *NameLength;

描述

getpeername 子例程从连接到指定套接字的对等套接字检索 Name 参数。 Name 参数包含成功完成后对等套接字的地址。

另一个进程创建的进程可以继承打开的套接字。 创建的进程可能需要标识它继承的套接字的地址。 getpeername 子例程允许进程在套接字连接的远程端检索对等套接字的地址。

注: getpeername 子例程仅在已连接的套接字上运行。

进程可以使用 getsockname 子例程来检索套接字的本地地址。

包含 getpeername 子例程的所有应用程序都必须在 _BSD 宏设置为特定值的情况下进行编译。 可接受的值为 43 和 44。 此外,所有套接字应用程序都必须包含 BSD libbsd.a 库。

参数

描述
套接字 指定已连接套接字的描述符编号。
名称 指向成功完成时包含目标套接字地址的 sockaddr 结构。 /usr/include/sys/socket.h 文件定义 sockaddr 结构。
NameLength 指向地址结构的大小。 初始化 NameLength 参数以指示 Name 参数所指向的空间量。 成功完成后,它将返回返回的 Name 参数的实际大小。

返回值

成功完成后,将返回值 0 ,并且 Name 参数保存对等套接字的地址。

如果 getpeername 子例程不成功,那么系统处理程序将执行以下函数:

  • 会向调用程序返回-1的值。
  • 将指示特定错误的错误代码移动到 errno 全局变量中。

错误代码

如果发生以下任何错误,那么 getpeername 子例程将失败:

错误 描述
EBADF Socket 参数无效。
EINVAL 套接字已关闭。
ENOTSOCK Socket 参数引用文件,而不是套接字。
ENOTCONN 未连接套接字。
ENOBUFS 系统中没有足够的可用资源来完成调用。
Efault Address 参数不在用户地址空间的可写部分中。

示例

以下程序片段说明了如何使用 getpeername 子例程返回在套接字另一端连接的对等节点的地址:

struct sockaddr_in name;
int namelen = sizeof(name);
.
.
.
if(getpeername(0,(struct sockaddr*)&name, &namelen)<0){
  syslog(LOG_ERR,"getpeername: %m");
  exit(1);
} else
  syslog(LOG_INFO,"Connection from %s",inet_ntoa(name.sin_addr));
.
.
.