|
|
|
udp_util
- UDP/IP Networking UtilitiesIn the UDP_UTIL package, the endpoints of a connection-less UDP "connection" are called, well, endpoints. A given program may create an anonymous UDP endpoint bound to a system-assigned network port:
udpCreate (NULL, NULL, &endpoint) ;or it may create a UDP endpoint bound to a predetermined network port (specified by name or port number):
udpCreate ("name", NULL, &endpoint) ;Client processes generally create anonymous UDP endpoints for the purpose of sending messages to a server process at a predetermined network port. With an anonymous endpoint, a client must let the server(s) know its port number before the client can receive messages from the server(s). The act of sending a datagram to the server(s) automatically supplies the server(s) with the client's port number and IP address.
By creating a UDP endpoint bound to a predetermined network port, a server is immediately ready to receive datagrams sent by clients to that port; the clients already know the port number, so there is no need for the server to send messages first.
To send a datagram from one endpoint to another, you must specify the network address of the destination endpoint. Since the destination endpoint probably belongs to another process, possibly on a remote host, the UDP_UTIL package requires you to create a proxy endpoint for the destination endpoint:
udpCreate ("name[@host]", source, &destination) ;A proxy endpoint simply specifies the network address of the destination endpoint; the proxy endpoint is not bound to a network port and it has no operating system socket associated with it. The proxy endpoint is internally linked with its source endpoint, so, when a datagram is sent to the proxy,
udpWrite()
automatically sends the datagram through
the source endpoint to the destination. A source endpoint may have many
proxy endpoints, but a given proxy endpoint is only linked to a single
source. (If you have multiple source endpoints, you can create multiple
proxy endpoints for the same destination.)
When a datagram is read from an anonymous or predetermined endpoint,
udpRead()
returns the text of the datagram and a proxy
endpoint for the sender of the datagram. The proxy endpoint can be used to
return a response to the sender:
char message[64], response[32] ; UdpEndpoint me, you ; ... -- Read message. udpRead (me, -1.0, sizeof message, message, NULL, &you) ; -- Send response. udpWrite (you, -1.0, sizeof response, response) ;Although there is no harm in doing so, there is no need to delete proxy endpoints; they are automatically garbage-collected when their source endpoint is deleted.
The following is a very simple server process that creates a UDP endpoint bound to a predetermined network port and then reads and displays messages received from clients:
#include <stdio.h> -- Standard I/O definitions. #include "udp_util.h" -- UDP utilities. main (int argc, char *argv[]) { char buffer[128] ; UdpEndpoint client, server ; -- Create UDP endpoint. udpCreate ("name", NULL, &server) ; for ( ; ; ) { -- Read and display messages. udpRead (server, -1.0, 128, buffer, NULL, &client) ; printf ("From %s: %s\n", udpName (client), buffer) ; } }The following client process creates an anonymous UDP endpoint and sends 16 messages through that endpoint to the server:
#include <stdio.h> -- Standard I/O definitions. #include "udp_util.h" -- UDP utilities. main (int argc, char *argv[]) { char buffer[128] ; int i ; UdpEndpoint client, server ; udpCreate (NULL, NULL, &client) ; -- Create client and target. udpCreate ("name[@host]", client, &server) ; for (i = 0 ; i < 16 ; i++) { -- Send messages. sprintf (buffer, "Hello for the %dth time!", i) ; udpWrite (server, -1.0, strlen (buffer) + 1, buffer) ; } udpDestroy (client) ; -- Deletes client and target. }Note that
client
is the anonymous endpoint and
server
is a proxy for the destination endpoint.
udpCreate()
- creates a UDP endpoint.
udpDestroy()
- destroys a UDP endpoint.
udpFd()
- returns the file descriptor for an endpoint's socket.
udpIsReadable()
- checks if a datagram is waiting to be read.
udpIsUp()
- checks if an endpoint is up.
udpIsWriteable()
- checks if a datagram can be written.
udpName()
- returns the name of an endpoint.
udpRead()
- reads a datagram.
udpSetBuf()
- changes the sizes of an endpoint's receive
and send buffers.
udpWrite()
- sends a datagram.
udp_util.c
udp_util.h
(See libnet
for the
complete source, including support routines and build files.)