Fixed crash/interface. Added tests.
This commit is contained in:
parent
29bb10b185
commit
1bd0efb067
4 changed files with 42 additions and 8 deletions
|
|
@ -31,7 +31,7 @@ else:
|
||||||
export Sockaddr_storage, Sockaddr_un, Sockaddr_un_path_length
|
export Sockaddr_storage, Sockaddr_un, Sockaddr_un_path_length
|
||||||
|
|
||||||
export SocketHandle, Sockaddr_in, Addrinfo, INADDR_ANY, SockAddr, SockLen,
|
export SocketHandle, Sockaddr_in, Addrinfo, INADDR_ANY, SockAddr, SockLen,
|
||||||
Sockaddr_in6,
|
Sockaddr_in6, Sockaddr_storage,
|
||||||
inet_ntoa, recv, `==`, connect, send, accept, recvfrom, sendto,
|
inet_ntoa, recv, `==`, connect, send, accept, recvfrom, sendto,
|
||||||
freeAddrInfo
|
freeAddrInfo
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -414,7 +414,7 @@ proc isIpAddress*(address_str: string): bool {.tags: [].} =
|
||||||
return false
|
return false
|
||||||
return true
|
return true
|
||||||
|
|
||||||
proc toSockAddr*(address: IpAddress, port: Port, sa: var SockAddr, sl: var Socklen) =
|
proc toSockAddr*(address: IpAddress, port: Port, sa: var Sockaddr_storage, sl: var Socklen) =
|
||||||
## Converts `IpAddress` and `Port` to `SockAddr` and `Socklen`
|
## Converts `IpAddress` and `Port` to `SockAddr` and `Socklen`
|
||||||
let port = htons(uint16(port))
|
let port = htons(uint16(port))
|
||||||
case address.family
|
case address.family
|
||||||
|
|
@ -431,18 +431,18 @@ proc toSockAddr*(address: IpAddress, port: Port, sa: var SockAddr, sl: var Sockl
|
||||||
s.sin6_port = port
|
s.sin6_port = port
|
||||||
copyMem(addr s.sin6_addr, unsafeAddr address.address_v6[0], sizeof(s.sin6_addr))
|
copyMem(addr s.sin6_addr, unsafeAddr address.address_v6[0], sizeof(s.sin6_addr))
|
||||||
|
|
||||||
proc fromSockAddr*(sa: SockAddr, sl: Socklen, address: var IpAddress, port: var Port) =
|
proc fromSockAddr*(sa: Sockaddr_storage, sl: Socklen, address: var IpAddress, port: var Port) =
|
||||||
## Converts `SockAddr` and `Socklen` to `IpAddress` and `Port`. Raises
|
## Converts `SockAddr` and `Socklen` to `IpAddress` and `Port`. Raises
|
||||||
## `ObjectConversionError` in case of invalid `sa` and `sl` arguments.
|
## `ObjectConversionError` in case of invalid `sa` and `sl` arguments.
|
||||||
if sa.sa_family.int == AF_INET.int and sl == sizeof(Sockaddr_in).Socklen:
|
if sa.ss_family.int == AF_INET.int and sl == sizeof(Sockaddr_in).Socklen:
|
||||||
address = IpAddress(family: IpAddressFamily.IPv4)
|
address = IpAddress(family: IpAddressFamily.IPv4)
|
||||||
let s = cast[ptr Sockaddr_in](unsafeAddr sa)
|
let s = cast[ptr Sockaddr_in](unsafeAddr sa)
|
||||||
copyMem(addr address.address_v4, addr s.sin_addr, sizeof(address.address_v4))
|
copyMem(addr address.address_v4[0], addr s.sin_addr, sizeof(address.address_v4))
|
||||||
port = ntohs(s.sin_port).Port
|
port = ntohs(s.sin_port).Port
|
||||||
elif sa.sa_family.int == AF_INET6.int and sl == sizeof(Sockaddr_in6).Socklen:
|
elif sa.ss_family.int == AF_INET6.int and sl == sizeof(Sockaddr_in6).Socklen:
|
||||||
address = IpAddress(family: IpAddressFamily.IPv6)
|
address = IpAddress(family: IpAddressFamily.IPv6)
|
||||||
let s = cast[ptr Sockaddr_in6](unsafeAddr sa)
|
let s = cast[ptr Sockaddr_in6](unsafeAddr sa)
|
||||||
copyMem(addr address.address_v6, addr s.sin6_addr, sizeof(address.address_v6))
|
copyMem(addr address.address_v6[0], addr s.sin6_addr, sizeof(address.address_v6))
|
||||||
port = ntohs(s.sin6_port).Port
|
port = ntohs(s.sin6_port).Port
|
||||||
else:
|
else:
|
||||||
raise newException(ObjectConversionError, "Unexpected SockAddr/Socklen")
|
raise newException(ObjectConversionError, "Unexpected SockAddr/Socklen")
|
||||||
|
|
|
||||||
|
|
@ -481,6 +481,10 @@ type
|
||||||
sin6_flowinfo*: int32 # unsigned
|
sin6_flowinfo*: int32 # unsigned
|
||||||
sin6_addr*: In6_addr
|
sin6_addr*: In6_addr
|
||||||
|
|
||||||
|
Sockaddr_storage* {.importc: "SOCKADDR_STORAGE",
|
||||||
|
header: "winsock2.h".} = object
|
||||||
|
ss_family*: int16
|
||||||
|
|
||||||
Servent* = object
|
Servent* = object
|
||||||
s_name*: cstring
|
s_name*: cstring
|
||||||
s_aliases*: cstringArray
|
s_aliases*: cstringArray
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import net
|
import net, nativesockets
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
suite "isIpAddress tests":
|
suite "isIpAddress tests":
|
||||||
|
|
@ -45,3 +45,33 @@ suite "parseIpAddress tests":
|
||||||
test "invalid ipv6":
|
test "invalid ipv6":
|
||||||
expect(ValueError):
|
expect(ValueError):
|
||||||
discard parseIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652")
|
discard parseIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652")
|
||||||
|
|
||||||
|
block: # "IpAddress/Sockaddr conversion"
|
||||||
|
proc test(ipaddrstr: string) =
|
||||||
|
var ipaddr_1 = parseIpAddress(ipaddrstr)
|
||||||
|
# echo ipaddrstr, " ", $ipaddr_1
|
||||||
|
|
||||||
|
doAssert($ipaddrstr == $ipaddr_1)
|
||||||
|
|
||||||
|
var sockaddr: Sockaddr_storage
|
||||||
|
var socklen: Socklen
|
||||||
|
var ipaddr_2: IpAddress
|
||||||
|
var port_2: Port
|
||||||
|
|
||||||
|
toSockAddr(ipaddr_1, Port(0), sockaddr, socklen)
|
||||||
|
fromSockAddr(sockaddr, socklen, ipaddr_2, port_2)
|
||||||
|
|
||||||
|
doAssert(ipaddrstr == $ipaddr_1)
|
||||||
|
|
||||||
|
doAssert(ipaddr_1 == ipaddr_2)
|
||||||
|
doAssert($ipaddr_1 == $ipaddr_2)
|
||||||
|
|
||||||
|
|
||||||
|
# ipv6 address of example.com
|
||||||
|
test("2606:2800:220:1:248:1893:25c8:1946")
|
||||||
|
# ipv6 address of localhost
|
||||||
|
test("::1")
|
||||||
|
# ipv4 address of example.com
|
||||||
|
test("93.184.216.34")
|
||||||
|
# ipv4 address of localhost
|
||||||
|
test("127.0.0.1")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue