2009-09-04 06:02:33 -04:00
|
|
|
USING: kernel accessors io.sockets io.sockets.private
|
|
|
|
io.backend.windows io.backend windows.winsock system destructors
|
|
|
|
alien.c-types classes.struct combinators ;
|
2008-12-14 21:03:00 -05:00
|
|
|
IN: io.sockets.windows
|
2008-05-15 02:45:32 -04:00
|
|
|
|
2009-09-04 06:02:33 -04:00
|
|
|
M: windows addrinfo-error ( n -- )
|
|
|
|
winsock-return-check ;
|
|
|
|
|
|
|
|
M: windows sockaddr-of-family ( alien af -- addrspec )
|
|
|
|
{
|
|
|
|
{ AF_INET [ sockaddr-in memory>struct ] }
|
|
|
|
{ AF_INET6 [ sockaddr-in6 memory>struct ] }
|
|
|
|
[ 2drop f ]
|
|
|
|
} case ;
|
|
|
|
|
|
|
|
M: windows addrspec-of-family ( af -- addrspec )
|
|
|
|
{
|
|
|
|
{ AF_INET [ T{ inet4 } ] }
|
|
|
|
{ AF_INET6 [ T{ inet6 } ] }
|
|
|
|
[ drop f ]
|
|
|
|
} case ;
|
|
|
|
|
2008-05-15 02:45:32 -04:00
|
|
|
HOOK: WSASocket-flags io-backend ( -- DWORD )
|
|
|
|
|
|
|
|
TUPLE: win32-socket < win32-file ;
|
|
|
|
|
|
|
|
: <win32-socket> ( handle -- win32-socket )
|
2008-06-27 20:26:36 -04:00
|
|
|
win32-socket new-win32-handle ;
|
2008-05-15 02:45:32 -04:00
|
|
|
|
|
|
|
M: win32-socket dispose ( stream -- )
|
|
|
|
handle>> closesocket drop ;
|
|
|
|
|
|
|
|
: unspecific-sockaddr/size ( addrspec -- sockaddr len )
|
2009-09-04 06:02:33 -04:00
|
|
|
[ empty-sockaddr/size ] [ protocol-family ] bi pick (>>family) ;
|
2008-05-15 02:45:32 -04:00
|
|
|
|
2008-05-15 06:20:42 -04:00
|
|
|
: opened-socket ( handle -- win32-socket )
|
|
|
|
<win32-socket> |dispose dup add-completion ;
|
|
|
|
|
|
|
|
: open-socket ( addrspec type -- win32-socket )
|
2008-12-02 04:10:13 -05:00
|
|
|
[ protocol-family ] dip
|
2008-05-15 02:45:32 -04:00
|
|
|
0 f 0 WSASocket-flags WSASocket
|
|
|
|
dup socket-error
|
2008-05-15 06:20:42 -04:00
|
|
|
opened-socket ;
|
2008-05-15 02:45:32 -04:00
|
|
|
|
2008-05-15 06:20:42 -04:00
|
|
|
M: object (get-local-address) ( socket addrspec -- sockaddr )
|
2008-12-02 04:10:13 -05:00
|
|
|
[ handle>> ] dip empty-sockaddr/size <int>
|
2008-05-15 02:45:32 -04:00
|
|
|
[ getsockname socket-error ] 2keep drop ;
|
|
|
|
|
2008-05-15 21:08:32 -04:00
|
|
|
M: object (get-remote-address) ( socket addrspec -- sockaddr )
|
2008-12-02 04:10:13 -05:00
|
|
|
[ handle>> ] dip empty-sockaddr/size <int>
|
2008-05-15 21:08:32 -04:00
|
|
|
[ getpeername socket-error ] 2keep drop ;
|
|
|
|
|
2008-05-15 06:20:42 -04:00
|
|
|
: bind-socket ( win32-socket sockaddr len -- )
|
2008-12-02 04:10:13 -05:00
|
|
|
[ handle>> ] 2dip bind socket-error ;
|
2008-05-15 06:20:42 -04:00
|
|
|
|
2008-05-15 02:45:32 -04:00
|
|
|
M: object ((client)) ( addrspec -- handle )
|
2008-05-15 06:20:42 -04:00
|
|
|
[ SOCK_STREAM open-socket ] keep
|
2009-09-27 11:31:02 -04:00
|
|
|
[
|
|
|
|
bind-local-address get
|
|
|
|
[ nip make-sockaddr/size ]
|
|
|
|
[ unspecific-sockaddr/size ] if* bind-socket
|
|
|
|
] [ drop ] 2bi ;
|
2008-05-15 02:45:32 -04:00
|
|
|
|
|
|
|
: server-socket ( addrspec type -- fd )
|
|
|
|
[ open-socket ] [ drop ] 2bi
|
2008-05-15 06:20:42 -04:00
|
|
|
[ make-sockaddr/size bind-socket ] [ drop ] 2bi ;
|
2008-05-15 02:45:32 -04:00
|
|
|
|
|
|
|
! http://support.microsoft.com/kb/127144
|
|
|
|
! NOTE: Possibly tweak this because of SYN flood attacks
|
|
|
|
: listen-backlog ( -- n ) HEX: 7fffffff ; inline
|
|
|
|
|
|
|
|
M: object (server) ( addrspec -- handle )
|
|
|
|
[
|
|
|
|
SOCK_STREAM server-socket
|
|
|
|
dup handle>> listen-backlog listen winsock-return-check
|
|
|
|
] with-destructors ;
|
|
|
|
|
|
|
|
M: windows (datagram) ( addrspec -- handle )
|
|
|
|
[ SOCK_DGRAM server-socket ] with-destructors ;
|