getpeername 子例程
用途
获取对等套接字的名称。
库
标准 C 库 (libc.a)
语法
#include <sys/socket.h>
int getpeername ( Socket, Name, NameLength)
int Socket;
struct sockaddr *Name;
socklen_t *NameLength;
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));
.
.
.