| net:client | | This is a framework for building network client applications. | It provides basic sockets, connecting to a server, | disconnecting, and some basic telnet support. | | We assume that the developer will have enough experience with | the protocols he wishes to support to make something useful | out of it. | ------------------------------------------------------------- : net.write vector ; : net.read vector ; : server: vector ; : disconnect vector ; : net? vector ; : key? vector ; : sockfd vector ; : net.emit pad c! pad 1 net.write ; loc: 2 constant PF_INET 1 constant PF_UNIX 1 constant SOCK_STREAM 2 constant SOCK_DGRAM create socketparams 2 , 1 , 0 , create sockaddr 0 , 0 , 0 , 0 , create connectparams 0 , sockaddr , 16 , : port: vector ; : ip: vector ; : socket vector ; : connect vector ; : connect: ip: port: socket dup connectparams ! connect drop ; loc: : socketcall 2 102 syscall ; :: socketparams 1 socketcall ; is socket :: connectparams 3 socketcall ; is connect : htons dup $00ff and 8 << swap $ff00 and 8 >> or ; :: wsparse >number drop htons 16 << PF_INET or sockaddr ! ; is port: ;loc loc: : scan 3 for '. parse >number drop next wsparse >number drop ; : build 3 for 8 << + next sockaddr cell+ ! ; :: scan build ; ;loc is ip: loc: : read 3 3 syscall ; : write 3 4 syscall ; : poll 3 168 syscall ; create pollfd 0 , 1 2, 0 2, create kfd 0 , 1 2, 0 2, :: 10 1 pollfd poll ; is net? :: 0 1 kfd poll ; is key? :: pollfd @ ; is sockfd :: connect: pollfd ! ; is server: :: 1 pad sockfd read drop pad c@ ; is net.read :: swap sockfd write drop ; is net.write :: sockfd 1 6 syscall drop ; is disconnect ;loc ;loc