Provide access to getsockname()/getpeername().
This patch implements procedures getLocalAddr() and getPeerAddr() that return the results of getsockname() and getpeername(), respectively, as pairs (string, Port) for both Socket and SockedHandle.
This commit is contained in:
parent
148bbee05f
commit
b9df1323f7
2 changed files with 74 additions and 0 deletions
|
|
@ -533,6 +533,14 @@ proc getSockOpt*(socket: Socket, opt: SOBool, level = SOL_SOCKET): bool {.
|
||||||
var res = getSockOptInt(socket.fd, cint(level), toCInt(opt))
|
var res = getSockOptInt(socket.fd, cint(level), toCInt(opt))
|
||||||
result = res != 0
|
result = res != 0
|
||||||
|
|
||||||
|
proc getLocalAddr*(socket: Socket): (string, Port) =
|
||||||
|
## Get the socket's local address and port number
|
||||||
|
getLocalAddr(socket.fd, socket.domain)
|
||||||
|
|
||||||
|
proc getPeerAddr*(socket: Socket): (string, Port) =
|
||||||
|
## Get the socket's peer address and port number
|
||||||
|
getPeerAddr(socket.fd, socket.domain)
|
||||||
|
|
||||||
proc setSockOpt*(socket: Socket, opt: SOBool, value: bool, level = SOL_SOCKET) {.
|
proc setSockOpt*(socket: Socket, opt: SOBool, value: bool, level = SOL_SOCKET) {.
|
||||||
tags: [WriteIOEffect].} =
|
tags: [WriteIOEffect].} =
|
||||||
## Sets option ``opt`` to a boolean value specified by ``value``.
|
## Sets option ``opt`` to a boolean value specified by ``value``.
|
||||||
|
|
|
||||||
|
|
@ -371,6 +371,72 @@ proc getSockName*(socket: SocketHandle): Port =
|
||||||
raiseOSError(osLastError())
|
raiseOSError(osLastError())
|
||||||
result = Port(rawsockets.ntohs(name.sin_port))
|
result = Port(rawsockets.ntohs(name.sin_port))
|
||||||
|
|
||||||
|
proc getLocalAddr*(socket: SocketHandle, domain: Domain): (string, Port) =
|
||||||
|
## returns the socket's local address and port number.
|
||||||
|
case domain
|
||||||
|
of AF_INET:
|
||||||
|
var name: Sockaddr_in
|
||||||
|
when useWinVersion:
|
||||||
|
name.sin_family = int16(ord(AF_INET))
|
||||||
|
else:
|
||||||
|
name.sin_family = posix.AF_INET
|
||||||
|
var namelen = sizeof(name).SockLen
|
||||||
|
if getsockname(socket, cast[ptr SockAddr](addr(name)),
|
||||||
|
addr(namelen)) == -1'i32:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
result = ($inet_ntoa(name.sin_addr), Port(rawsockets.ntohs(name.sin_port)))
|
||||||
|
of AF_INET6:
|
||||||
|
var name: Sockaddr_in6
|
||||||
|
when useWinVersion:
|
||||||
|
name.sin6_family = int16(ord(AF_INET6))
|
||||||
|
else:
|
||||||
|
name.sin6_family = posix.AF_INET6
|
||||||
|
var namelen = sizeof(name).SockLen
|
||||||
|
if getsockname(socket, cast[ptr SockAddr](addr(name)),
|
||||||
|
addr(namelen)) == -1'i32:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
# Cannot use INET6_ADDRSTRLEN here, because it's a C define.
|
||||||
|
var buf: array[64, char]
|
||||||
|
if inet_ntop(name.sin6_family.cint,
|
||||||
|
addr name, buf.cstring, sizeof(buf).int32).isNil:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
result = ($buf, Port(rawsockets.ntohs(name.sin6_port)))
|
||||||
|
else:
|
||||||
|
raiseOSError(OSErrorCode(-1), "invalid socket family in getLocalAddr")
|
||||||
|
|
||||||
|
proc getPeerAddr*(socket: SocketHandle, domain: Domain): (string, Port) =
|
||||||
|
## returns the socket's peer address and port number.
|
||||||
|
case domain
|
||||||
|
of AF_INET:
|
||||||
|
var name: Sockaddr_in
|
||||||
|
when useWinVersion:
|
||||||
|
name.sin_family = int16(ord(AF_INET))
|
||||||
|
else:
|
||||||
|
name.sin_family = posix.AF_INET
|
||||||
|
var namelen = sizeof(name).SockLen
|
||||||
|
if getpeername(socket, cast[ptr SockAddr](addr(name)),
|
||||||
|
addr(namelen)) == -1'i32:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
result = ($inet_ntoa(name.sin_addr), Port(rawsockets.ntohs(name.sin_port)))
|
||||||
|
of AF_INET6:
|
||||||
|
var name: Sockaddr_in6
|
||||||
|
when useWinVersion:
|
||||||
|
name.sin6_family = int16(ord(AF_INET6))
|
||||||
|
else:
|
||||||
|
name.sin6_family = posix.AF_INET6
|
||||||
|
var namelen = sizeof(name).SockLen
|
||||||
|
if getpeername(socket, cast[ptr SockAddr](addr(name)),
|
||||||
|
addr(namelen)) == -1'i32:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
# Cannot use INET6_ADDRSTRLEN here, because it's a C define.
|
||||||
|
var buf: array[64, char]
|
||||||
|
if inet_ntop(name.sin6_family.cint,
|
||||||
|
addr name, buf.cstring, sizeof(buf).int32).isNil:
|
||||||
|
raiseOSError(osLastError())
|
||||||
|
result = ($buf, Port(rawsockets.ntohs(name.sin6_port)))
|
||||||
|
else:
|
||||||
|
raiseOSError(OSErrorCode(-1), "invalid socket family in getLocalAddr")
|
||||||
|
|
||||||
proc getSockOptInt*(socket: SocketHandle, level, optname: int): int {.
|
proc getSockOptInt*(socket: SocketHandle, level, optname: int): int {.
|
||||||
tags: [ReadIOEffect].} =
|
tags: [ReadIOEffect].} =
|
||||||
## getsockopt for integer options.
|
## getsockopt for integer options.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue