1 USING: kernel accessors io.sockets io.windows io.backend
\r
2 windows.winsock system destructors alien.c-types ;
\r
3 IN: io.windows.sockets
\r
5 HOOK: WSASocket-flags io-backend ( -- DWORD )
\r
7 TUPLE: win32-socket < win32-file ;
\r
9 : <win32-socket> ( handle -- win32-socket )
\r
10 win32-socket new-win32-handle ;
\r
12 M: win32-socket dispose ( stream -- )
\r
13 handle>> closesocket drop ;
\r
15 : unspecific-sockaddr/size ( addrspec -- sockaddr len )
\r
16 [ empty-sockaddr/size ] [ protocol-family ] bi
\r
17 pick set-sockaddr-in-family ;
\r
19 : opened-socket ( handle -- win32-socket )
\r
20 <win32-socket> |dispose dup add-completion ;
\r
22 : open-socket ( addrspec type -- win32-socket )
\r
23 >r protocol-family r>
\r
24 0 f 0 WSASocket-flags WSASocket
\r
28 M: object (get-local-address) ( socket addrspec -- sockaddr )
\r
29 >r handle>> r> empty-sockaddr/size <int>
\r
30 [ getsockname socket-error ] 2keep drop ;
\r
32 M: object (get-remote-address) ( socket addrspec -- sockaddr )
\r
33 >r handle>> r> empty-sockaddr/size <int>
\r
34 [ getpeername socket-error ] 2keep drop ;
\r
36 : bind-socket ( win32-socket sockaddr len -- )
\r
37 >r >r handle>> r> r> bind socket-error ;
\r
39 M: object ((client)) ( addrspec -- handle )
\r
40 [ SOCK_STREAM open-socket ] keep
\r
41 [ unspecific-sockaddr/size bind-socket ] [ drop ] 2bi ;
\r
43 : server-socket ( addrspec type -- fd )
\r
44 [ open-socket ] [ drop ] 2bi
\r
45 [ make-sockaddr/size bind-socket ] [ drop ] 2bi ;
\r
47 ! http://support.microsoft.com/kb/127144
\r
48 ! NOTE: Possibly tweak this because of SYN flood attacks
\r
49 : listen-backlog ( -- n ) HEX: 7fffffff ; inline
\r
51 M: object (server) ( addrspec -- handle )
\r
53 SOCK_STREAM server-socket
\r
54 dup handle>> listen-backlog listen winsock-return-check
\r
55 ] with-destructors ;
\r
57 M: windows (datagram) ( addrspec -- handle )
\r
58 [ SOCK_DGRAM server-socket ] with-destructors ;
\r
60 M: windows addrinfo-error ( n -- )
\r
61 winsock-return-check ;
\r