Adding more UDP support + example.
This commit is contained in:
@ -88,6 +88,8 @@ forth definitions
|
|||||||
vocabulary sockets sockets definitions
|
vocabulary sockets sockets definitions
|
||||||
transfer sockets-builtins
|
transfer sockets-builtins
|
||||||
1 constant SOCK_STREAM
|
1 constant SOCK_STREAM
|
||||||
|
2 constant SOCK_DGRAM
|
||||||
|
3 constant SOCK_RAW
|
||||||
2 constant AF_INET
|
2 constant AF_INET
|
||||||
16 constant sizeof(sockaddr_in)
|
16 constant sizeof(sockaddr_in)
|
||||||
1 constant SOL_SOCKET
|
1 constant SOL_SOCKET
|
||||||
|
|||||||
@ -389,6 +389,12 @@ static cell_t TimerIsrRegister(cell_t group, cell_t timer, cell_t xt, cell_t arg
|
|||||||
YV(sockets, sockaccept, n0 = accept(n2, (struct sockaddr *) a1, (socklen_t *) a0); NIPn(2)) \
|
YV(sockets, sockaccept, n0 = accept(n2, (struct sockaddr *) a1, (socklen_t *) a0); NIPn(2)) \
|
||||||
YV(sockets, select, n0 = select(n4, (fd_set *) a3, (fd_set *) a2, (fd_set *) a1, (struct timeval *) a0); NIPn(4)) \
|
YV(sockets, select, n0 = select(n4, (fd_set *) a3, (fd_set *) a2, (fd_set *) a1, (struct timeval *) a0); NIPn(4)) \
|
||||||
YV(sockets, poll, n0 = poll((struct pollfd *) a2, (nfds_t) n1, n0); NIPn(2)) \
|
YV(sockets, poll, n0 = poll((struct pollfd *) a2, (nfds_t) n1, n0); NIPn(2)) \
|
||||||
|
YV(sockets, send, n0 = send(n3, a2, n1, n0); NIPn(3)) \
|
||||||
|
YV(sockets, sendto, n0 = sendto(n5, a4, n3, n2, (const struct sockaddr *) a1, n0); NIPn(5)) \
|
||||||
|
YV(sockets, sendmsg, n0 = sendmsg(n2, (const struct msghdr *) a1, n0); NIPn(2)) \
|
||||||
|
YV(sockets, recv, n0 = recv(n3, a2, n1, n0); NIPn(3)) \
|
||||||
|
YV(sockets, recvfrom, n0 = recvfrom(n5, a4, n3, n2, (struct sockaddr *) a1, (socklen_t *) a0); NIPn(5)) \
|
||||||
|
YV(sockets, recvmsg, n0 = recvmsg(n2, (struct msghdr *) a1, n0); NIPn(2)) \
|
||||||
XV(sockets, "errno", ERRNO, PUSH errno)
|
XV(sockets, "errno", ERRNO, PUSH errno)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
54
examples/udp.fs
Normal file
54
examples/udp.fs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#! /usr/bin/env ueforth
|
||||||
|
|
||||||
|
also sockets
|
||||||
|
also tasks
|
||||||
|
also posix
|
||||||
|
|
||||||
|
1024 constant max-msg
|
||||||
|
create msg max-msg allot
|
||||||
|
-1 value sockfd
|
||||||
|
|
||||||
|
variable len max-msg len !
|
||||||
|
: reader
|
||||||
|
begin
|
||||||
|
sockfd msg len 0 0 0 recvfrom
|
||||||
|
dup 0 >= if
|
||||||
|
msg swap type cr
|
||||||
|
else drop then
|
||||||
|
pause
|
||||||
|
again
|
||||||
|
;
|
||||||
|
' reader 10 10 task reader-task
|
||||||
|
|
||||||
|
sockaddr incoming
|
||||||
|
sockaddr outgoing
|
||||||
|
|
||||||
|
: udp ( port -- )
|
||||||
|
incoming ->port!
|
||||||
|
AF_INET SOCK_DGRAM 0 socket to sockfd
|
||||||
|
sockfd non-block throw
|
||||||
|
sockfd incoming sizeof(sockaddr_in) bind throw
|
||||||
|
reader-task start-task
|
||||||
|
stdin non-block throw
|
||||||
|
;
|
||||||
|
|
||||||
|
: say ( port -- )
|
||||||
|
outgoing ->port!
|
||||||
|
sockfd tib >in @ + #tib @ >in @ -
|
||||||
|
0 outgoing sizeof(sockaddr_in) sendto drop
|
||||||
|
#tib @ >in !
|
||||||
|
;
|
||||||
|
|
||||||
|
: hear begin pause again ;
|
||||||
|
|
||||||
|
: help
|
||||||
|
." USAGE INSTRUCTIONS" cr
|
||||||
|
." ------------------" cr
|
||||||
|
." <port> udp ( open UDP connection on port )" cr
|
||||||
|
." hear ( wait for messages on udp port and print then )" cr
|
||||||
|
." <port> say <message text> ( send a message to a port )" cr
|
||||||
|
cr
|
||||||
|
." Example: 9999 udp hear ( listener )" cr
|
||||||
|
." Example: 9998 udp 9999 say Can you hear me? ( sender )" cr
|
||||||
|
;
|
||||||
|
help quit
|
||||||
@ -23,7 +23,18 @@ z" accept" 3 sysfunc sockaccept
|
|||||||
z" poll" 3 sysfunc poll
|
z" poll" 3 sysfunc poll
|
||||||
z" setsockopt" 5 sysfunc setsockopt
|
z" setsockopt" 5 sysfunc setsockopt
|
||||||
|
|
||||||
|
z" send" 4 sysfunc send
|
||||||
|
z" sendto" 6 sysfunc sendto
|
||||||
|
z" sendmsg" 3 sysfunc sendmsg
|
||||||
|
|
||||||
|
z" recv" 4 sysfunc recv
|
||||||
|
z" recvfrom" 6 sysfunc recvfrom
|
||||||
|
z" recvmsg" 3 sysfunc recvmsg
|
||||||
|
|
||||||
1 constant SOCK_STREAM
|
1 constant SOCK_STREAM
|
||||||
|
2 constant SOCK_DGRAM
|
||||||
|
3 constant SOCK_RAW
|
||||||
|
|
||||||
2 constant AF_INET
|
2 constant AF_INET
|
||||||
16 constant sizeof(sockaddr_in)
|
16 constant sizeof(sockaddr_in)
|
||||||
1 constant SOL_SOCKET
|
1 constant SOL_SOCKET
|
||||||
|
|||||||
Reference in New Issue
Block a user