WSAGetLastError [
ERROR_IO_PENDING ERROR_SUCCESS
] member? [
- win32-error-message throw
+ WSAGetLastError win32-error-message throw
] unless ;
: new-socket ( -- socket )
timeout get [ millis cutoff get > [ socket get CancelIo ] when ] when
] bind ;
+: client-sockaddr ( host port -- sockaddr )
+ setup-sockaddr [
+ >r gethostbyname handle-socket-error hostent-addr
+ r> set-sockaddr-in-addr
+ ] keep ;
+
IN: io
: accept ( server -- client )
win32-server-this [
dupd <win32-client-stream> swap buffer-free
] bind ;
+: <client> ( host port -- stream )
+ maybe-init-winsock client-sockaddr new-socket
+ [ swap "sockaddr-in" c-size connect drop handle-socket-error ] keep
+ dup add-completion <win32-stream> <line-reader> ;
+
: GetAcceptExSockaddrs ( stack effect is too long to put here -- )
"void" "mswsock" "GetAcceptExSockaddrs"
[ "void*" "int" "int" "int" "void*" "void*" "void*" "void*" ] alien-invoke ;
+
+BEGIN-STRUCT: hostent
+ FIELD: char* name
+ FIELD: void* aliases
+ FIELD: short addrtype
+ FIELD: short length
+ FIELD: void* addr-list
+END-STRUCT
+
+: hostent-addr hostent-addr-list *void* *uint ;
+
+: gethostbyname ( name -- hostent )
+ "hostent*" "winsock" "gethostbyname" [ "char*" ] alien-invoke ;
+
+: connect ( socket sockaddr addrlen -- int )
+ "int" "winsock" "connect" [ "void*" "sockaddr-in*" "int" ]
+ alien-invoke ;
+