From: Jos v.d.V. <jo...@us...> - 2007-01-06 12:27:57
|
Update of /cvsroot/win32forth/win32forth/src/lib In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv13257 Added Files: Sockets.f Log Message: Jos: Update from jmdrake --- NEW FILE: Sockets.f --- \ Windows Sockets of Andrey Cherezov \ January 6th, 2007: Adapted for Win32Forth version 6.11.10 anew sockets.f winlibrary wsock32.dll 1 CONSTANT SOCK_STREAM -1 CONSTANT INVALID_SOCKET -1 CONSTANT SOCKET_ERROR 2 CONSTANT PF_INET 2 CONSTANT AF_INET 6 CONSTANT IPPROTO_TCP NOSTACK \ A tip from: Alex McDonald October 16th, 2002 0 2 FIELD+ sin_family 2 FIELD+ sin_port 4 FIELD+ sin_addr 8 FIELD+ sin_zero CONSTANT /sockaddr_in CREATE sock_addr HERE /sockaddr_in DUP ALLOT ERASE AF_INET sock_addr sin_family W! CHECKSTACK : ASCIIZ> 100 2dup 0 scan nip - ; : ztype ( z"a -- ) ASCIIZ> type ; : CreateSocket ( -- socket ior ) IPPROTO_TCP SOCK_STREAM PF_INET call socket DUP INVALID_SOCKET = IF call WSAGetLastError ELSE 0 THEN ; : ToRead ( socket -- n ior ) \ ñêîëüêî áàéò ìîæíî ñåé÷àñ ïðî÷åñòü èç ñîêåòà \ ìîæíî èñïîëüçîâàòü ïåðåä ReadSocket äëÿ òîãî ÷òîáû \ èçáåæàòü áëîêèðîâàíèÿ ïðè n=0 0 >r rp@ [ HEX ] 4004667F [ DECIMAL ] ROT call ioctlsocket SOCKET_ERROR = IF r>drop 0 call WSAGetLastError ELSE r> 0 THEN ; : ConnectSocket ( IP port socket -- ior ) >R 256 /MOD SWAP 256 * + sock_addr sin_port W! sock_addr sin_addr ! /sockaddr_in sock_addr R> call connect SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN ; : CloseSocket ( s -- ior ) call closesocket SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN ; : WriteSocket ( addr u s -- ior ) >r 0 swap rot r> \ 0 u addr s call send SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN ; : SWrite ( addr u s -- wlen ) >r 0 swap rot r> \ 0 u addr s call send ; : WriteSocketLine ( addr u s -- ior ) DUP >R WriteSocket ?DUP IF R> DROP EXIT THEN crlf$ COUNT R> WriteSocket ; : WriteSocketCRLF ( s -- ior ) HERE 0 ROT WriteSocketLine ; : ReadSocket ( addr u s -- rlen ior ) >r 0 swap rot r> \ 0 u addr s call recv DUP SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN OVER 0= IF DROP -1002 THEN ( åñëè ïðèíÿòî 0, òî îáðûâ ñîåäèíåíèÿ ) ; : SRead ( addr u s -- r ) >r 0 swap rot r> \ 0 u addr s call recv ; CODE a>r@ ( a1 -- n1 ) mov ebx, 0 [ebx] next c; : GetHostName ( IP -- addr u ior ) >r PF_INET 4 rp@ call gethostbyaddr ?DUP IF A>R@ ASCIIZ> 0 ELSE HERE 0 call WSAGetLastError THEN r>drop ; : Get.Host.Name ( addr u -- addr u ior ) DROP call inet_addr GetHostName ; : zGetHostIP ( z" -- IP ior ) dup c@ [char] 0 [char] 9 between over and if call inet_addr 0 else dup if then call gethostbyname DUP IF 3 CELLS + A>R@ A>R@ A>R@ 0 ELSE call WSAGetLastError THEN then ; \ changed Samstag, Mai 15 2004 - 13:20 dbu create my-ip-addr-buf 256 allot 0 my-ip-addr-buf ! : my-ip-addr ( -- IP ) my-ip-addr-buf zGetHostIP drop ; : GetHostIP ( addr len -- IP ior ) RP@ 265 - RP! RP@ 265 ERASE RP@ SWAP 265 UMIN CMOVE RP@ zGetHostIP RP@ 265 + RP! ; CREATE sock_addr2 HERE /sockaddr_in DUP ALLOT ERASE AF_INET sock_addr2 sin_family W! : GetPeerName ( s -- addr u ior ) /sockaddr_in >r rp@ sock_addr2 ROT call getpeername SOCKET_ERROR = IF HERE 0 call WSAGetLastError ELSE sock_addr2 sin_addr @ GetHostName THEN r>drop ; : SocketsStartup ( -- ior ) HERE 257 call WSAStartup ; : SocketsCleanup ( -- ior ) call WSACleanup ; : BindSocket ( port s -- ior ) >R /sockaddr_in ALLOCATE ?DUP IF NIP R> DROP EXIT THEN >R 256 /MOD SWAP 256 * + R@ sin_port W! AF_INET R@ sin_family W! R@ 0 R@ sin_addr ! /sockaddr_in R> R> call bind SWAP FREE DROP SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN ; : ListenSocket ( s -- ior ) 2 SWAP call listen SOCKET_ERROR = IF call WSAGetLastError ELSE 0 THEN ; CREATE SINLEN /sockaddr_in , : SOCKET-ACCEPT { ADDR ALEN FH -- s2 ior } &OF ALEN ADDR FH call accept DUP INVALID_SOCKET = IF call WSAGetLastError ELSE 0 THEN ; : #IP ( du -- 0 ) #S [CHAR] . HOLD 2DROP 0 ; : (.IP) ( IP -- addr u ) 0 256 UM/MOD 0 256 UM/MOD 0 256 UM/MOD 0 <# \ 0 HOLD #IP #IP #IP #S #> ; : NtoA (.IP) ; : CLIENT-OPEN ( addr u port -- s ) >r GetHostIP abort" Server not available " r> CreateSocket DROP DUP >r ConnectSocket abort" Can't connect " r> ; \s SocketsStartup [if] cr .( SocketsStartup error) abort [then] create my-ip-name cr my-ip-addr cr dup NtoA type GetHostName drop space type \ dup 1+ allot my-ip-name place \s |