: set-ioctl-socket ( handle cmd arg -- )
[ handle>> ] 2dip ulong <ref> ioctlsocket socket-error ;
-M: windows addrinfo-error-string ( n -- string )
+M: windows addrinfo-error-string
n>win32-error-string ;
-M: windows sockaddr-of-family ( alien af -- addrspec )
+M: windows sockaddr-of-family
{
{ AF_INET [ sockaddr-in memory>struct ] }
{ AF_INET6 [ sockaddr-in6 memory>struct ] }
[ 2drop f ]
} case ;
-M: windows addrspec-of-family ( af -- addrspec )
+M: windows addrspec-of-family
{
{ AF_INET [ T{ ipv4 } ] }
{ AF_INET6 [ T{ ipv6 } ] }
: <win32-socket> ( handle -- win32-socket )
win32-socket new-win32-handle ;
-M: win32-socket dispose* ( stream -- )
+M: win32-socket dispose*
handle>> closesocket socket-error* ;
: unspecific-sockaddr/size ( addrspec -- sockaddr len )
dup socket-error
opened-socket ;
-M: object (get-local-address) ( socket addrspec -- sockaddr )
+M: object (get-local-address)
[ handle>> ] dip empty-sockaddr/size int <ref>
[ getsockname socket-error ] keepd ;
-M: object (get-remote-address) ( socket addrspec -- sockaddr )
+M: object (get-remote-address)
[ handle>> ] dip empty-sockaddr/size int <ref>
[ getpeername socket-error ] keepd ;
: bind-socket ( win32-socket sockaddr len -- )
[ handle>> ] 2dip bind socket-error ;
-M: object remote>handle ( addrspec -- handle )
+M: object remote>handle
[ SOCK_STREAM open-socket ] keep
[
bind-local-address get
! NOTE: Possibly tweak this because of SYN flood attacks
: listen-backlog ( -- n ) 0x7fffffff ; inline
-M: object (server) ( addrspec -- handle )
+M: object (server)
[
SOCK_STREAM server-socket
dup handle>> listen-backlog listen winsock-return-check
] with-destructors ;
-M: windows (datagram) ( addrspec -- handle )
+M: windows (datagram)
[ SOCK_DGRAM server-socket ] with-destructors ;
-M: windows (raw) ( addrspec -- handle )
+M: windows (raw)
[ SOCK_RAW server-socket ] with-destructors ;
-M: windows (broadcast) ( datagram -- datagram )
+M: windows (broadcast)
dup handle>> SOL_SOCKET SO_BROADCAST set-socket-option ;
: malloc-int ( n -- alien )
stdcall alien-indirect drop
winsock-error ; inline
-M: object establish-connection ( client-out remote -- )
+M: object establish-connection
make-sockaddr/size-outgoing <ConnectEx-args>
swap >>port
dup port>> handle>> handle>> >>s
] [ port>> addr>> protocol-family ] bi
sockaddr-of-family ; inline
-M: object (accept) ( server addr -- handle sockaddr )
+M: object (accept)
[
<AcceptEx-args>
{
[ lpFromLen>> int deref ]
tri memcpy ; inline
-M: windows (receive-unsafe) ( n buf datagram -- count addrspec )
+M: windows (receive-unsafe)
[
<WSARecvFrom-args>
[ call-WSARecvFrom ]
[ lpCompletionRoutine>> ]
} cleave WSASendTo socket-error* ; inline
-M: windows (send) ( packet addrspec datagram -- )
+M: windows (send)
[
<WSASendTo-args>
[ call-WSASendTo ]