API
1. getpeername()
#include <sys/socket.h>int getpeername(int sockfd, struct sockaddr *restrict addr,socklen_t *restrict addrlen);// On success, returns 0. On error, -1 is returned and errno is set.
返回连接到sockfd
对端的地址,存入addr
。
其中参数addrlen
应该被初始化为addr
所指空间的长度。
返回时,会在addrlen
中存入实际返回的字节数。
如果addr
缓冲区太小,IP名会被截断。
2. getsockname()
#include <sys/socket.h>int getsockname(int sockfd, struct sockaddr *restrict addr,socklen_t *restrict addrlen);//Returns 0 on success and returns -1 on error.
返回sockfd
当前所绑定的地址,存入addr
所指缓冲区。
addrlen
表示addr
缓冲区的长度。
返回时,addrlen
用于返回实际上的addr
的大小。
如果addr
缓冲区太小,地址会被截断,这种情况下,addrlen
会返回一个比初始提供的更大的值。
例子
static string
get_remote_ip_by_fd (int sockfd) noexcept (false)
{struct sockaddr_storage addr;socklen_t addrlen = sizeof (addr);if (getpeername (sockfd, (sockaddr *) &addr, &addrlen) == -1)throw _SocketException (getpeername);sockaddr_in *tcp_addr = (sockaddr_in *) &addr;char ip[INET_ADDRSTRLEN];if (inet_ntop (AF_INET, &tcp_addr->sin_addr, ip, sizeof (ip)) == NULL)throw _SocketException (inet_ntop);return string (ip);
}