version 1.37, 2010/09/05 21:27:42
|
version 1.38, 2010/09/13 20:18:30
|
Line 95 end-struct addrinfo
|
Line 95 end-struct addrinfo
|
|
|
Create sockaddr-tmp |
Create sockaddr-tmp |
sockaddr-tmp sockaddr_in %size dup allot erase |
sockaddr-tmp sockaddr_in %size dup allot erase |
|
Create hints |
|
hints addrinfo %size dup allot erase |
|
Variable addrres |
|
|
: c-string ( addr u -- addr' ) |
: c-string ( addr u -- addr' ) |
tuck pad swap move pad + 0 swap c! pad ; |
tuck pad swap move pad + 0 swap c! pad ; |
Line 110 sockaddr-tmp sockaddr_in %size dup allot
|
Line 113 sockaddr-tmp sockaddr_in %size dup allot
|
[THEN] |
[THEN] |
@ @ l@ ntohl ; |
@ @ l@ ntohl ; |
|
|
|
0 Constant PF_UNSPEC |
2 Constant PF_INET |
2 Constant PF_INET |
1 Constant SOCK_STREAM |
1 Constant SOCK_STREAM |
2 Constant SOCK_DGRAM |
2 Constant SOCK_DGRAM |
Line 140 $004 Constant POLLOUT
|
Line 144 $004 Constant POLLOUT
|
htons r@ port w! |
htons r@ port w! |
htonl r> sin_addr l! ; |
htonl r> sin_addr l! ; |
|
|
: open-socket ( addr u port -- fid ) |
: open-socket1 ( addr u port -- fid ) |
-rot host>addr |
-rot host>addr |
swap sockaddr-tmp >inetaddr |
swap sockaddr-tmp >inetaddr |
new-socket >r |
new-socket >r |
r@ sockaddr-tmp sockaddr_in %size connect 0< abort" can't connect" |
r@ sockaddr-tmp sockaddr_in %size connect 0< abort" can't connect" |
r> s" w+" c-string fdopen ; |
r> s" w+" c-string fdopen ; |
|
|
: open-udp-socket ( addr u port -- fid ) |
: open-udp-socket1 ( addr u port -- fid ) |
-rot host>addr |
-rot host>addr |
swap sockaddr-tmp >inetaddr |
swap sockaddr-tmp >inetaddr |
new-udp-socket >r |
new-udp-socket >r |
r@ sockaddr-tmp sockaddr_in %size connect 0< abort" can't connect" |
r@ sockaddr-tmp sockaddr_in %size connect 0< abort" can't connect" |
r> s" w+" c-string fdopen ; |
r> s" w+" c-string fdopen ; |
|
|
|
\ getaddrinfo based open-socket |
|
|
|
: >hints ( socktype -- ) |
|
hints addrinfo %size erase |
|
PF_UNSPEC hints ai_family l! |
|
hints ai_socktype l! ; |
|
|
|
: get-info ( addr u port -- info ) |
|
base @ >r decimal 0 <<# 0 hold #s #> r> base ! drop |
|
>r c-string r> hints addrres getaddrinfo #>> |
|
?dup IF |
|
gai_strerror cstring>sstring type |
|
true abort" getaddrinfo failed" THEN |
|
addrres @ ; |
|
|
|
: get-socket ( info -- socket ) dup >r >r |
|
BEGIN r@ WHILE |
|
r@ ai_family l@ r@ ai_socktype l@ r@ ai_protocol l@ socket |
|
dup 0>= IF |
|
dup r@ ai_addr @ r@ ai_addrlen @ connect |
|
IF |
|
closesocket drop |
|
ELSE |
|
s" w+" c-string fdopen |
|
rdrop r> freeaddrinfo EXIT |
|
THEN |
|
ELSE drop THEN |
|
r> ai_next @ >r REPEAT |
|
rdrop r> freeaddrinfo true abort" can't connect" ; |
|
|
|
: open-socket ( addr u port -- fid ) |
|
SOCK_STREAM >hints get-info get-socket ; |
|
|
|
: open-udp-socket ( addr u port -- fid ) |
|
SOCK_DGRAM >hints get-info get-socket ; |
|
|
: create-server ( port# -- lsocket ) |
: create-server ( port# -- lsocket ) |
sockaddr-tmp sockaddr_in %size erase |
sockaddr-tmp sockaddr_in %size erase |
PF_INET sockaddr-tmp family w! |
PF_INET sockaddr-tmp family w! |