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);
}