io.sockets: Special-case 0.0.0.0 and f for outgoing sockets so we can use
them on windows. Add some tests that shouldn't fail. Fixes #85.db4
parent
027a9fb1a2
commit
a12a56f777
|
@ -251,13 +251,13 @@ HELP: broadcast-once
|
||||||
}
|
}
|
||||||
{ $description "Broadcasts a packet one time to the address and closes the sending broadcast port." } ;
|
{ $description "Broadcasts a packet one time to the address and closes the sending broadcast port." } ;
|
||||||
|
|
||||||
HELP: with-random-local-broadcast
|
HELP: with-any-port-local-broadcast
|
||||||
{ $values
|
{ $values
|
||||||
{ "quot" quotation }
|
{ "quot" quotation }
|
||||||
}
|
}
|
||||||
{ $description "Creates a broadcast datagram socket and calls the quotation with this datagram on top of the stack, cleaning up afterwards." } ;
|
{ $description "Creates a broadcast datagram socket and calls the quotation with this datagram on top of the stack, cleaning up afterwards." } ;
|
||||||
|
|
||||||
HELP: with-random-local-datagram
|
HELP: with-any-port-local-datagram
|
||||||
{ $values
|
{ $values
|
||||||
{ "quot" quotation }
|
{ "quot" quotation }
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,3 +174,13 @@ os unix? [
|
||||||
{ f } [ f protocol-port ] unit-test
|
{ f } [ f protocol-port ] unit-test
|
||||||
|
|
||||||
[ "you-cant-resolve-me!" resolve-host ] [ addrinfo-error? ] must-fail-with
|
[ "you-cant-resolve-me!" resolve-host ] [ addrinfo-error? ] must-fail-with
|
||||||
|
|
||||||
|
[ ] [ B{ 1 2 3 } f 9000 <inet4> send-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } f 9000 <inet4> broadcast-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } "0.0.0.0" 9000 <inet4> send-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } "0.0.0.0" 9000 <inet4> broadcast-once ] unit-test
|
||||||
|
|
||||||
|
[ ] [ B{ 1 2 3 } f 9000 <inet6> send-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } f 9000 <inet6> broadcast-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } "::" 9000 <inet6> send-once ] unit-test
|
||||||
|
[ ] [ B{ 1 2 3 } "::" 9000 <inet6> broadcast-once ] unit-test
|
||||||
|
|
|
@ -29,6 +29,8 @@ GENERIC: sockaddr-size ( addrspec -- n )
|
||||||
|
|
||||||
GENERIC: make-sockaddr ( addrspec -- sockaddr )
|
GENERIC: make-sockaddr ( addrspec -- sockaddr )
|
||||||
|
|
||||||
|
GENERIC: make-sockaddr-outgoing ( addrspec -- sockaddr )
|
||||||
|
|
||||||
GENERIC: empty-sockaddr ( addrspec -- sockaddr )
|
GENERIC: empty-sockaddr ( addrspec -- sockaddr )
|
||||||
|
|
||||||
GENERIC: address-size ( addrspec -- n )
|
GENERIC: address-size ( addrspec -- n )
|
||||||
|
@ -37,6 +39,9 @@ GENERIC: inet-ntop ( data addrspec -- str )
|
||||||
|
|
||||||
GENERIC: inet-pton ( str addrspec -- data )
|
GENERIC: inet-pton ( str addrspec -- data )
|
||||||
|
|
||||||
|
: make-sockaddr/size-outgoing ( addrspec -- sockaddr size )
|
||||||
|
[ make-sockaddr-outgoing ] [ sockaddr-size ] bi ;
|
||||||
|
|
||||||
: make-sockaddr/size ( addrspec -- sockaddr size )
|
: make-sockaddr/size ( addrspec -- sockaddr size )
|
||||||
[ make-sockaddr ] [ sockaddr-size ] bi ;
|
[ make-sockaddr ] [ sockaddr-size ] bi ;
|
||||||
|
|
||||||
|
@ -96,13 +101,21 @@ M: ipv4 sockaddr-size drop sockaddr-in heap-size ;
|
||||||
|
|
||||||
M: ipv4 empty-sockaddr drop sockaddr-in <struct> ;
|
M: ipv4 empty-sockaddr drop sockaddr-in <struct> ;
|
||||||
|
|
||||||
M: ipv4 make-sockaddr ( inet -- sockaddr )
|
: make-sockaddr-part ( inet -- sockaddr )
|
||||||
sockaddr-in <struct>
|
sockaddr-in <struct>
|
||||||
AF_INET >>family
|
AF_INET >>family
|
||||||
swap
|
swap
|
||||||
[ port>> htons >>port ]
|
port>> htons >>port ; inline
|
||||||
[ host>> "0.0.0.0" or ]
|
|
||||||
[ inet-pton uint deref >>addr ] tri ;
|
M: ipv4 make-sockaddr ( inet -- sockaddr )
|
||||||
|
[ make-sockaddr-part ]
|
||||||
|
[ host>> "0.0.0.0" or ]
|
||||||
|
[ inet-pton uint deref >>addr ] tri ;
|
||||||
|
|
||||||
|
M: ipv4 make-sockaddr-outgoing ( inet -- sockaddr )
|
||||||
|
[ make-sockaddr-part ]
|
||||||
|
[ host>> dup { f "0.0.0.0" } member? [ drop "127.0.0.1" ] when ]
|
||||||
|
[ inet-pton uint deref >>addr ] tri ;
|
||||||
|
|
||||||
M: ipv4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec )
|
M: ipv4 parse-sockaddr ( sockaddr-in addrspec -- newaddrspec )
|
||||||
[ addr>> uint <ref> ] dip inet-ntop <ipv4> ;
|
[ addr>> uint <ref> ] dip inet-ntop <ipv4> ;
|
||||||
|
@ -160,14 +173,23 @@ M: ipv6 sockaddr-size drop sockaddr-in6 heap-size ;
|
||||||
|
|
||||||
M: ipv6 empty-sockaddr drop sockaddr-in6 <struct> ;
|
M: ipv6 empty-sockaddr drop sockaddr-in6 <struct> ;
|
||||||
|
|
||||||
M: ipv6 make-sockaddr ( inet -- sockaddr )
|
: make-sockaddr-in6-part ( inet -- sockaddr )
|
||||||
sockaddr-in6 <struct>
|
sockaddr-in6 <struct>
|
||||||
AF_INET6 >>family
|
AF_INET6 >>family
|
||||||
swap
|
swap
|
||||||
[ port>> htons >>port ]
|
port>> htons >>port ; inline
|
||||||
[ [ host>> "::" or ] keep inet-pton >>addr ]
|
|
||||||
[ scope-id>> >>scopeid ]
|
M: ipv6 make-sockaddr ( inet -- sockaddr )
|
||||||
tri ;
|
[ make-sockaddr-in6-part ]
|
||||||
|
[ [ host>> "::" or ] keep inet-pton >>addr ]
|
||||||
|
[ scope-id>> >>scopeid ]
|
||||||
|
tri ;
|
||||||
|
|
||||||
|
M: ipv6 make-sockaddr-outgoing ( inet -- sockaddr )
|
||||||
|
[ make-sockaddr-in6-part ]
|
||||||
|
[ [ host>> dup { f "::" } member? [ drop "::1" ] when ] keep inet-pton >>addr ]
|
||||||
|
[ scope-id>> >>scopeid ]
|
||||||
|
tri ;
|
||||||
|
|
||||||
M: ipv6 parse-sockaddr
|
M: ipv6 parse-sockaddr
|
||||||
[ [ addr>> ] dip inet-ntop ] [ drop scopeid>> ] 2bi
|
[ [ addr>> ] dip inet-ntop ] [ drop scopeid>> ] 2bi
|
||||||
|
@ -435,29 +457,30 @@ M: invalid-local-address summary
|
||||||
: protocol-port ( protocol -- port )
|
: protocol-port ( protocol -- port )
|
||||||
[ f getservbyname [ port>> htons ] [ f ] if* ] [ f ] if* ;
|
[ f getservbyname [ port>> htons ] [ f ] if* ] [ f ] if* ;
|
||||||
|
|
||||||
|
: <any-port-local-inet4> ( -- inet4 ) f 0 <inet4> ;
|
||||||
|
: <any-port-local-inet6> ( -- inet6 ) f 0 <inet6> ;
|
||||||
|
|
||||||
GENERIC: <random-local-inet> ( inet -- inet4 )
|
GENERIC: <any-port-local-inet> ( inet -- inet4 )
|
||||||
M: inet4 <random-local-inet> drop f 0 <inet4> ;
|
M: inet4 <any-port-local-inet> drop <any-port-local-inet4> ;
|
||||||
M: inet <random-local-inet> drop resolve-localhost random ;
|
M: inet6 <any-port-local-inet> drop f 0 <inet6> ;
|
||||||
M: inet6 <random-local-inet> drop f 0 <inet6> ;
|
|
||||||
|
|
||||||
: <random-local-datagram> ( inet -- datagram )
|
: <any-port-local-datagram> ( inet -- datagram )
|
||||||
<random-local-inet> <datagram> ;
|
<any-port-local-inet> <datagram> ;
|
||||||
|
|
||||||
: <random-local-broadcast> ( inet -- datagram )
|
: <any-port-local-broadcast> ( inet -- datagram )
|
||||||
<random-local-inet> <broadcast> ;
|
<any-port-local-inet> <broadcast> ;
|
||||||
|
|
||||||
: with-random-local-datagram ( quot -- )
|
: with-any-port-local-datagram ( quot -- )
|
||||||
[ dup <random-local-datagram> ] dip with-disposal ; inline
|
[ dup <any-port-local-datagram> ] dip with-disposal ; inline
|
||||||
|
|
||||||
: with-random-local-broadcast ( quot -- )
|
: with-any-port-local-broadcast ( quot -- )
|
||||||
[ dup <random-local-broadcast> ] dip with-disposal ; inline
|
[ dup <any-port-local-broadcast> ] dip with-disposal ; inline
|
||||||
|
|
||||||
: send-once ( bytes addrspec -- )
|
: send-once ( bytes addrspec -- )
|
||||||
[ send ] with-random-local-datagram ;
|
[ send ] with-any-port-local-datagram ;
|
||||||
|
|
||||||
: broadcast-once ( bytes addrspec -- )
|
: broadcast-once ( bytes addrspec -- )
|
||||||
[ send ] with-random-local-broadcast ;
|
[ send ] with-any-port-local-broadcast ;
|
||||||
|
|
||||||
{
|
{
|
||||||
{ [ os unix? ] [ "io.sockets.unix" require ] }
|
{ [ os unix? ] [ "io.sockets.unix" require ] }
|
||||||
|
|
|
@ -152,7 +152,7 @@ TUPLE: ConnectEx-args port
|
||||||
winsock-error ; inline
|
winsock-error ; inline
|
||||||
|
|
||||||
M: object establish-connection ( client-out remote -- )
|
M: object establish-connection ( client-out remote -- )
|
||||||
make-sockaddr/size <ConnectEx-args>
|
make-sockaddr/size-outgoing <ConnectEx-args>
|
||||||
swap >>port
|
swap >>port
|
||||||
dup port>> handle>> handle>> >>s
|
dup port>> handle>> handle>> >>s
|
||||||
dup s>> get-ConnectEx-ptr >>ptr
|
dup s>> get-ConnectEx-ptr >>ptr
|
||||||
|
@ -292,7 +292,7 @@ TUPLE: WSASendTo-args port
|
||||||
WSASendTo-args new
|
WSASendTo-args new
|
||||||
swap >>port
|
swap >>port
|
||||||
dup port>> handle>> handle>> >>s
|
dup port>> handle>> handle>> >>s
|
||||||
swap make-sockaddr/size
|
swap make-sockaddr/size-outgoing
|
||||||
[ malloc-byte-array &free ] dip
|
[ malloc-byte-array &free ] dip
|
||||||
[ >>lpTo ] [ >>iToLen ] bi*
|
[ >>lpTo ] [ >>iToLen ] bi*
|
||||||
swap make-send-buffer >>lpBuffers
|
swap make-send-buffer >>lpBuffers
|
||||||
|
|
|
@ -16,7 +16,7 @@ TUPLE: tcp-echo < threaded-server #times #bytes ;
|
||||||
binary \ tcp-echo new-threaded-server
|
binary \ tcp-echo new-threaded-server
|
||||||
swap >>#bytes
|
swap >>#bytes
|
||||||
swap >>#times
|
swap >>#times
|
||||||
<random-local-inet4> >>insecure ;
|
<any-port-local-inet4> >>insecure ;
|
||||||
|
|
||||||
ERROR: incorrect-#bytes ;
|
ERROR: incorrect-#bytes ;
|
||||||
|
|
||||||
|
|
|
@ -328,7 +328,7 @@ M: TXT rdata>byte-array
|
||||||
[
|
[
|
||||||
10 seconds over set-timeout
|
10 seconds over set-timeout
|
||||||
[ send ] [ receive drop ] bi
|
[ send ] [ receive drop ] bi
|
||||||
] with-random-local-datagram ;
|
] with-any-port-local-datagram ;
|
||||||
|
|
||||||
: <dns-inet4> ( -- inet4 )
|
: <dns-inet4> ( -- inet4 )
|
||||||
dns-servers get random 53 <inet4> ;
|
dns-servers get random 53 <inet4> ;
|
||||||
|
|
|
@ -106,7 +106,7 @@ PRIVATE>
|
||||||
123 <inet> resolve-host
|
123 <inet> resolve-host
|
||||||
[ inet4? ] filter random [
|
[ inet4? ] filter random [
|
||||||
[ REQUEST ] 2dip [ send ] [ receive drop ] bi (ntp)
|
[ REQUEST ] 2dip [ send ] [ receive drop ] bi (ntp)
|
||||||
] with-random-local-datagram ;
|
] with-any-port-local-datagram ;
|
||||||
|
|
||||||
: default-ntp ( -- ntp )
|
: default-ntp ( -- ntp )
|
||||||
"pool.ntp.org" <ntp> ;
|
"pool.ntp.org" <ntp> ;
|
||||||
|
|
Loading…
Reference in New Issue