Legal Notices The information in this document is subject to change without notice. Hewlett-Packard makes no warranty of any kind with regard to this manual, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. Hewlett-Packard...
Page 6
Contents Example Using Internet Stream Sockets ......48 3. Advanced Topics for Stream Sockets Socket Options ..........61 Getting and Setting Socket Options.
Page 7
Contents 4. Using Internet Datagram Sockets Overview ..........86 Preparing Address Variables .
Page 8
Contents Using Broadcast Addresses ........122 6. Using UNIX Domain Stream Sockets Overview .
Printing History The manual printing date and part number indicate its current edition. The printing date will change when a new edition is printed. Minor changes may be made at reprint without changing the printing date. the manual part number will change when extensive changes are made. Manual updates may be issued between editions to correct errors or document product changes.
Page 13
Preface This guide describes HP's BSD Sockets. BSD Sockets is a set of programming development tools for interprocess communication. HP's implementation of BSD Sockets is a full set of sockets from the networking services originally developed by the University of California at Berkeley (UCB).
Page 14
Chapter 5 Advanced Topics for Internet Datagram Sockets includes information about default socket address, synchronous I/O multiplexing with select, sending and receiving IP multicast datagrams, and broadcast addresses. Chapter 6 Using UNIX Domain Stream Sockets describes the steps involved in creating a UNIX Domain stream socket connection between two processes executing on the same node.
BSD Sockets Concepts The BSD Sockets facility allows you to create distributed applications that pass data between programs (on the same computer or on separate computers on the network) without requiring an understanding of the...
Page 16
BSD Sockets Concepts many layers of networking protocols. This is accomplished by using a set of system calls. These system calls allow you to create communication endpoints called sockets and transfer data between them. BSD Sockets is a program development tool. Before you attempt to use NOTE BSD Sockets, you may need to familiarize yourself with the C programming language and the HP-UX operating system.
BSD Sockets Concepts Introduction Introduction This guide describes the steps involved in establishing and using BSD Sockets connections. It also describes the protocols you must use and how the BSD Sockets system calls interact. The details of each system call are described in the corresponding man pages. Key Terms and Concepts For a basic understanding of BSD Sockets and its general model, you should review the following terms and definitions.
Page 18
BSD Sockets Concepts Introduction binding Before a socket can be accessed across the network, it must be bound to an address. Binding associates a socket address with a socket and makes the socket accessible to other sockets on the network. Once a socket address is bound, other sockets can connect to the socket and send data to or receive data from channel...
Page 19
BSD Sockets Concepts Introduction socket address For the internet address family (AF_INET), the socket address consists of the internet address, port address and address family of a socket. The internet and port address combination allows the network to locate a socket. For UNIX Domain (AF_UNIX), the socket address is the directory pathname bound to the socket.
BSD Sockets Concepts How You Can Use BSD Sockets How You Can Use BSD Sockets The best example of how BSD Sockets can be used is the Internet Services. These services use BSD Sockets to communicate between remote hosts. Using the BSD Sockets facility, you can write your own distributed application programs to do a variety of tasks.
BSD Sockets Concepts The Client-Server Model The Client-Server Model Typical BSD Sockets applications consist of two separate application level processes; one process (the client) requests a connection and the other process (the server) accepts it. The server process creates a socket, binds an address to it, and sets up a mechanism (called a listen queue) for receiving connection requests.
Page 22
BSD Sockets Concepts The Client-Server Model Figure 1-1 Client-Server in a Pre-Connection State Chapter 1...
Page 23
BSD Sockets Concepts The Client-Server Model Figure 1-2 Client-Server at Time of Connection Request Chapter 1...
Page 24
BSD Sockets Concepts The Client-Server Model Figure 1-3 Client-Server When Connection is Established Chapter 1...
BSD Sockets Concepts BSD Sockets Library Routines BSD Sockets Library Routines The library routines and system calls that you need to implement a BSD Sockets application are described throughout the guide. In addition, a complete list of all these routines and system calls is provided in the “Summary Tables for Library and System Calls”...
Page 28
Using Internet Stream Sockets NOTE Release 10.10 and later releases support two variations of sockets behavior: classic HP-UX sockets and X/Open sockets. By default, users receive classic HP-UX sockets. To use X/Open sockets, users must make an addition to their make files by including the “-l xnet” argument with the “c89”...
Using Internet Stream Sockets Overview Overview Internet TCP stream sockets provide bidirectional, reliable, sequenced and unduplicated flow of data without record boundaries. The following table lists the steps involved in creating and terminating a BSD Sockets connection using stream sockets. Table 2-1 Creating/Terminating BSD Sockets Connections Using Internet Stream Sockets...
Page 30
Using Internet Stream Sockets Overview Each of these steps or activities is described in more detail in the following sections. The description of each activity specifies a system call and includes: • What happens when the system call is used. •...
Using Internet Stream Sockets Preparing Address Variables Preparing Address Variables Before you create a connection, establish the correct variables and collect the information that you need to request a connection. Your server process needs to: • Declare socket address variables. •...
Using Internet Stream Sockets Preparing Address Variables Field Description Specifies the address family and should short sin_family always be set to AF_INET. Specifies the port address. Assign this field u_short sin_port when you bind the port address for the socket or when you get a port address for a specific service.
Using Internet Stream Sockets Preparing Address Variables #include <netdb.h> struct hostent *hp; /* pointer to host info for remote host */ peeraddr.sin_family = AF_INET; hp = gethostbyname (argv[1]); peeraddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; The argv[1] parameter is the host name specified in the client program command line.
Using Internet Stream Sockets Preparing Address Variables #include <netdb.h> struct servent *sp; /* pointer to service info */ sp = getservbyname (“example”, “tcp”); peeraddr.sin_port = sp->s_port; When to Get the Server's Socket Address The server process needs to get the socket address before binding the listen socket.
Using Internet Stream Sockets Writing the Server Process Writing the Server Process This section explains the calls your server process must make to connect with and serve a client process. Creating a Socket The server process must call socket to create a communication endpoint.
Using Internet Stream Sockets Writing the Server Process When to Create Sockets The server process should create a socket before any other BSD Sockets system calls. Refer to the socket(2) man page for more information on socket. Binding a Socket Address to the Server Process's Socket After your server process has created a socket, it must call bind to bind a socket address.
Using Internet Stream Sockets Writing the Server Process Example: struct sockaddr_in myaddr; bind (ls, &myaddr, sizeof(struct sockaddr_in)); When to Bind Socket Addresses The server process should bind the socket address after the socket is created and before any other BSD Sockets system calls. Refer to the bind(2) man page for more information on bind.
Using Internet Stream Sockets Writing the Server Process backlog is the preferred number of unaccepted incoming connections allowed at a given time. The actual number may be greater than the specified backlog. When the request is full, further connection requests are rejected.
Page 39
Using Internet Stream Sockets Writing the Server Process OUTPUT Parameter Contents INPUT Value Value socket socket descriptor of unchanged descriptor of server socket local socket addr socket address pointer to address pointer to structure where socket address will be put address of client socket that server’s...
Using Internet Stream Sockets Writing the Client Process Writing the Client Process This section explains the calls your client process must make to connect with and be served by a server process. Creating a Socket The client process must call socket to create a communication endpoint. socket and its parameters are described in the following table.
Using Internet Stream Sockets Writing the Client Process Requesting a Connection Once the server process is listening for connection requests, the client process can request a connection with the connect call. connect and its parameters are described in the following table. Include files: #include <sys/types.h>...
Page 42
Using Internet Stream Sockets Writing the Client Process NOTE The client process does not get feedback that the server process has completed the accept call. As soon as the connect call returns, the client process can send data. Local internet and port addresses are bound when connect is executed if you have not already bound them yourself.
Using Internet Stream Sockets Sending and Receiving Data Sending and Receiving Data After the connect and accept calls are successfully executed, the connection is established and data can be sent and received between the two socket endpoints. Because the stream socket descriptors correspond to HP-UX file descriptors, you can use the read and write calls (in addition to recv and send) to pass data through a socket-terminated channel.
Using Internet Stream Sockets Sending and Receiving Data Description of Parameter INPUT Value Contents pointer to data buffer pointer to data to be sent size of data buffer size of msg flags settings for optional flags 0 or MSG_OOB Function result: number of bytes actually sent, –1 if failure occurs. Example: count = send (s, buf, 10, 0);...
Using Internet Stream Sockets Sending and Receiving Data Description of Parameter INPUT Value Contents socket descriptor of local socket descriptor of socket socket receiving data pointer to data buffer pointer to buffer that is to receive data maximum number of size of data buffer bytes that should be received...
Page 46
Using Internet Stream Sockets Sending and Receiving Data Use the MSG_PEEK option to preview incoming data. If this option is set on a recv, any data returned remains in the socket buffer as though it had not been read yet. The next recv returns the same data. When to Receive Data The server or client process should receive data after connection is established.
Using Internet Stream Sockets Closing a Socket Closing a Socket In most applications, you do not have to worry about cleaning up your sockets. When you exit your program and your process terminates, the sockets are closed for you. If you need to close a socket while your program is still running, use the close system call.
Example Using Internet Stream Sockets NOTE These programs are provided as examples only of stream socket usage and are not Hewlett-Packard supported products. These program examples demonstrate how to set up and use internet stream sockets. These sample programs are in the /usr/lib/demos/networking/socket directory.
Page 49
Using Internet Stream Sockets Example Using Internet Stream Sockets * demonstrate many of the features of sockets, as well as good * conventions for using these features. * This program provides a service called “example”. In order for * it to function, an entry for it needs to exist in the * /etc/services file.
Page 50
Using Internet Stream Sockets Example Using Internet Stream Sockets * network at once will be able to have one server * listening on all networks at once. Even when the * host is connected to only one network, this is good * practice, because it makes the server program more * portable.
Page 51
Using Internet Stream Sockets Example Using Internet Stream Sockets fprintf(stderr, “%s: unable to fork daemon\n”, argv[0]); exit(1); case 0: /* The child process (daemon) comes here. */ /* Close stdin and stderr so that they will not * be kept open. Stdout is assumed to have been * redirected to some logging file, or /dev/null.
Page 52
Using Internet Stream Sockets Example Using Internet Stream Sockets S E R V E R This is the actual server routine that the daemon forks to handle each individual connection. Its purpose is to receive the request packets from the remote client, process them, and return the results to the client.
Page 53
Using Internet Stream Sockets Example Using Internet Stream Sockets exit(1); /* Go into a loop, receiving requests from the * remote client. After the client has sent the * last request, it will do a shutdown for sending, * which causes an end-of-file condition to appear * on this end of the connection.
Page 54
Using Internet Stream Sockets Example Using Internet Stream Sockets /* The port number must be converted first to * host byte order before printing. On most hosts, * this is not necessary, but the ntohs() call is * included here so this program could easily * be ported to a host that does require it.
Page 55
Using Internet Stream Sockets Example Using Internet Stream Sockets int argc; char *argv[]; int addrlen, i, j; /* This example uses 10 byte messages. */ char buf[10]; if (argc != 2) { fprintf(stderr, “Usage:%s <remote host>\n” argv[0]; exit(1); /* clear out address structures */ memset ((char *)&myaddr_in, 0, sizeof(struct sockaddr_in));...
Page 56
Using Internet Stream Sockets Example Using Internet Stream Sockets * addrlen needs to be passed in as a pointer, * because getsockname returns the actual length * of the address. addrlen = sizeof(struct sockaddr_in); if (getsockname(s, &myaddr_in, &addrlen) == -1) { perror(argv[0]);...
Page 57
Using Internet Stream Sockets Example Using Internet Stream Sockets if (shutdown(s, 1) == -1) { perror(argv[0]); fprintf(stderr, “%s: unable to shutdown socket\n”,argv[0]); exit(1); /* Start receiving all the replys from the server. * This loop will terminate when the recv returns * zero, which is an end-of-file condition.
Page 58
Using Internet Stream Sockets Example Using Internet Stream Sockets Chapter 2...
Page 60
Advanced Topics for Stream Sockets This chapter explains the following: • Socket options. • Synchronous I/O multiplexing with select. • Sending and receiving data asynchronously. • Nonblocking I/O. • Using shutdown. • Using read and write to make stream sockets transparent. •...
Advanced Topics for Stream Sockets Socket Options Socket Options The operation of sockets is controlled by socket level options. The following options are supported for internet stream sockets: • SO_REUSEADDR • SO_KEEPALIVE • SO_DONTROUTE • SO_SNDBUF • SO_RCVBUF • SO_LINGER •...
Advanced Topics for Stream Sockets Socket Options • SO_SNDTIMEO • SO_RCVTIMEO • SO_BROADCAST • SO_REUSEPORT In addition, the SO_DEBUG option is supported for compatibility only; it has no functionality. Options for protocol levels are described in the individual protocol manual pages, such as tcp(7p), udp(7p), and ip(7p). The next section describes how to get the current value of a socket option and to set socket options, followed by a description of each available option.
Page 63
Advanced Topics for Stream Sockets Socket Options OUTPUT Parameter Contents INPUT Value Value socket socket descriptor unchanged descriptor for which option values are to be returned level protocol SOL_SOCKET unchanged level optname name of supported option unchanged option name optval pointer to pointer to buffer pointer to buffer...
Page 64
Advanced Topics for Stream Sockets Socket Options • SO_RCVTIMEO The following socket options toggle socket behavior. optval is an integer containing a boolean flag for the behavior (1 = on, 0 = off): • SO_KEEPALIVE • SO_DEBUG • SO_DONTROUTE • SO_USELOOPBACK •...
Advanced Topics for Stream Sockets Socket Options Description of Parameter INPUT Value Contents optname name of option supported option name optval pointer to option input Must be at least size of value (int). Holds either value to be set or boolean flag optlen length of optval size of optval...
Advanced Topics for Stream Sockets Socket Options Network Daemon Server Listening at Port 2000. When the network daemon accepts a connection request, the accepted socket will bind to port 2000 and to the address where the daemon is running (e.g. 192.6.250.100).
Advanced Topics for Stream Sockets Socket Options SO_DONTROUTE This option is AF_INET socket-specific. SO_DONTROUTE indicates that outgoing messages should bypass the standard routing facilities. Instead, messages are directed to the appropriate network interface according to the network portion of the destination address.
Advanced Topics for Stream Sockets Socket Options Table 3-1 Summary Information for Changing Socket Buffer Size SocketType (Protocol) stream (TCP) When Buffer Size at any time Increase Allowed When Buffer Size only prior to establishing a Decrease Allowed connection Maximum Buffer Size 262144 bytes SO_LINGER SO_LINGER controls the actions taken when a close is executed on a...
Advanced Topics for Stream Sockets Socket Options Table 3-2 Summary of Linger Options on Close Wait Does Not Socket Option Linger Graceful Hard Wait for Option Interval Close Close Close Close SO_LINGER don't care SO_LINGER zero SO_LINGER nonzero SO_USELOOPBACK This option is not applicable to UNIX Domain sockets. SO_USELOOPBACK directs the network layer (IP) of networking code to use the local loopback address when sending data from this socket.
Advanced Topics for Stream Sockets Socket Options SO_RCVLOWAT This option allows the user to set or fetch the low water mark for the socket's receive socket buffer. At present, this option is not used. It is supported in anticipation of future use. SO_SNDTIMEO This option allows the user to set or fetch the timeout value for a socket's send socket buffer.At present, this option is not used.
Page 71
Advanced Topics for Stream Sockets Socket Options are bound to the port. All processes that share the port must specify this option. For more information on using this option, see “Sending and Receiving IP Multicast Datagrams,” in Chapter 5. Chapter 3...
Advanced Topics for Stream Sockets Synchronous I/O Multiplexing with Select Synchronous I/O Multiplexing with Select The select system call can be used with sockets to provide a synchronous multiplexing mechanism. The system call has several parameters which govern its behavior. If you specify a zero pointer for the timeout parameter, select will block until one or more of the specified socket descriptors is ready.
Page 73
Advanced Topics for Stream Sockets Synchronous I/O Multiplexing with Select The following example illustrates the select system call. Since it is possible for a process to have more than 32 open file descriptors, the bit masks used by select are interpreted as arrays of integers. The header file sys/types.h contains some useful macros to be used with the select() system call, some of which are reproduced below.
Page 74
Advanced Topics for Stream Sockets Synchronous I/O Multiplexing with Select exit(1); if (FD_ISSET(s, &read_mask)) do_read(s); /* something to read on socket s */ /* fall through as maybe more to do */ if (FD_ISSET(s, &write_mask)) do_write(s); /* space to write on socket s */ Chapter 3...
Advanced Topics for Stream Sockets Sending and Receiving Data Asynchronously Sending and Receiving Data Asynchronously Asynchronous sockets allow a user program to receive an SIGIO signal when the state of the socket changes. This state change can occur, for example, when new data arrives. Currently the user would have to issue a select system call in order to determine if data were available.
Page 76
Advanced Topics for Stream Sockets Sending and Receiving Data Asynchronously Notification that out-of-band data has been received is also done asynchronously; see the section “Sending and Receiving Out-of-band Data” in this chapter for more details. The following example sets up an asynchronous SOCK_STREAM listen socket.
Advanced Topics for Stream Sockets Nonblocking I/O Nonblocking I/O Sockets are created in blocking mode I/O by default. You can specify that a socket be put in nonblocking mode by using the ioctl system call with the FIOSNBIO request. Here is an example: #include <sys/ioctl.h>...
Advanced Topics for Stream Sockets Using Shutdown Using Shutdown When your program is done reading or writing on a particular socket connection, you can use shutdown to bring down a part of the connection. When one process uses shutdown on a socket descriptor, all other processes with the same socket descriptor are affected.
Advanced Topics for Stream Sockets Using Shutdown Description of Parameter INPUT Value Contents socket descriptor socket descriptor of socket to be shut down number that indicates 0, 1 or 2 the type of shutdown Function result: 0 if shutdown is successful, –1 if failure occurs. Example: shutdown (s, 1);...
Advanced Topics for Stream Sockets Using Read and Write to Make Stream Sockets Transparent Using Read and Write to Make Stream Sockets Transparent An example application of read and write with stream sockets is to fork a command with a socket descriptor as stdout. The peer process can read input from the command.
Advanced Topics for Stream Sockets Sending and Receiving Out-of-band Data Sending and Receiving Out-of-band Data This option is not supported for UNIX Domain (AF_UNIX) sockets. If an abnormal condition occurs when a process is in the middle of sending a long stream of data, it is useful to be able to alert the other process with an urgent message.
Page 82
Advanced Topics for Stream Sockets Sending and Receiving Out-of-band Data vec.sv_onstack = 0; if (sigvector(SIGURG, &vec, (struct sigvec *) 0) < 0) { perror(“sigvector(SIGURG)”); onurg() is a routine that handles out-of-band data in the client program. In addition, the socket's process group must be set, as shown below. The kernel will not send the signal to the process (or process group) unless this is done, even though the signal handler has been enabled.
Page 83
Advanced Topics for Stream Sockets Sending and Receiving Out-of-band Data out-of-band pointer. However, once you read past the out-of-band pointer location with subsequent recv calls, the out-of-band byte can no longer be read. Usually the out-of-band data message indicates that all data currently in the stream can be flushed.
Page 84
Advanced Topics for Stream Sockets Sending and Receiving Out-of-band Data printf(”received %c OOB\n”, mark); return; Chapter 3...
Using Internet Datagram Sockets Overview Overview Internet UDP datagram sockets provide bidirectional flow of data with record boundaries preserved. However, messages are not guaranteed to be reliably delivered. If a message is delivered, there is no guarantee that it is in sequence and unduplicated, but the data in the message are guaranteed to be intact.
Page 87
Using Internet Datagram Sockets Overview Table 4-1 Exchanging Data Between Internet Datagram Sockets Client System Server Process System Call Process Call Used Activity Used Activity create a socket create a socket socket() socket() bind a socket bind a socket bind() bind() address address...
Using Internet Datagram Sockets Preparing Address Variables Preparing Address Variables Before your client process can make a request of the server process, you must establish the correct variables and collect the information that you need about the server process and the service provided. The server process needs to: •...
Using Internet Datagram Sockets Preparing Address Variables Field Description Specifies the address family and should short sin_family always be set to AF_INET. Specifies the port address. Assign this field u_short sin_port when you bind the port address for the socket or when you get a port address for a specific service.
Using Internet Datagram Sockets Preparing Address Variables #include <netdb.h> struct hostent *hp; /* point to host info for name server host */ servaddr.sin_family = AF_INET; hp = gethostbyname (argv[1]); servaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; The argv[1] parameter is the host name specified in the client program command line.
Using Internet Datagram Sockets Preparing Address Variables When to Get Server's Socket Address The server process should get the server’s socket address before binding. The client process should get the server’s socket address before client requests the service from the host. Refer to the getservent(3N) man page for more information on getservbyname.
Using Internet Datagram Sockets Writing the Server and Client Processes Writing the Server and Client Processes This section explains the calls your server and client processes must make. Creating Sockets Both processes must call socket to create communication endpoints. socket and its parameters are described in the following table. Include files: #include <sys/types.h>...
Using Internet Datagram Sockets Writing the Server and Client Processes When to Create Sockets The server or client process should create a socket before any other BSD Sockets system calls. Refer to the socket(2) man page for more information on socket. Binding Socket Addresses to Datagram Sockets After each process has created a socket, it must call bind to bind a...
Page 94
Using Internet Datagram Sockets Writing the Server and Client Processes Parameter Description of Contents INPUT Value socket descriptor of local socket descriptor of socket socket to be bound addr socket address pointer to address to be bound to s addrlen length of socket address size of struct sockaddr_in_address...
Using Internet Datagram Sockets Sending and Receiving Messages Sending and Receiving Messages The sendto and recvfrom (or sendmsg and recvmsg) system calls are usually used to transmit and receive messages. Sending Messages Use sendto or sendmsg to send messages. sendmsg allows the send data to be gathered from several buffers.
Using Internet Datagram Sockets Sending and Receiving Messages Parameter Description of Contents INPUT Value flags settings for optional flags 0 (no options are currently supported) address of recipient socket pointer to the socket address that message should be sent to tolen size of to length of address...
Page 97
Using Internet Datagram Sockets Sending and Receiving Messages recv can also be used if you do not need to know what socket sent the message. However, if you want to send a response to the message, you must know where it came from. Except for the extra information returned by recvfrom and recvmsg, the three calls are identical.
Using Internet Datagram Sockets Sending and Receiving Messages OUTPUT Parameter Contents INPUT Value Value flags settings for 0 or MSG_PEEK unchanged optional flags from address of pointer to address pointer to socket that structure, not used socket sent message for input address of socket that sent the...
Page 99
Using Internet Datagram Sockets Sending and Receiving Messages • MSG_PEEK for a nondestructive read. Use the MSG_PEEK option to preview an incoming message. If this option is set on a recvfrom, any message returned remains in the data buffer as though it had not been read yet. The next recvfrom will return the same message.
Using Internet Datagram Sockets Closing a Socket Closing a Socket In most applications, you do not have to worry about cleaning up your sockets. When you exit your program and your process terminates, the sockets are closed for you. If you need to close a socket while your program is still running, use the HP-UX file system call close.
Example Using Datagram Sockets NOTE These programs are provided as examples only of datagram socket usage and are not Hewlett-Packard supported products. These program examples demonstrate how to set up and use datagram sockets. These sample programs can be found in the /usr/lib/demos/networking/socket directory.
Page 102
Using Internet Datagram Sockets Example Using Datagram Sockets #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <netdb.h> int s; /* socket descriptor */ #define BUFFERSIZE 1024 /* max size of packets to be received */ int cc; /* contains the number of bytes read */ char buffer[BUFFERSIZE];...
Page 103
Using Internet Datagram Sockets Example Using Datagram Sockets myaddr_in.sin_addr.s_addr = INADDR_ANY; /* Find the information for the ”example” server * in order to get the needed port number. sp = getservbyname (”example”, ”udp”); if (sp == NULL) { printf(”%s: host not found”, argv[0]);...
Page 104
Using Internet Datagram Sockets Example Using Datagram Sockets /* This will open the /etc/hosts file and keep * it open. This will make accesses to it faster. * If the host has been configured to use the NIS * server or name server (BIND), it is desirable * not to call sethostent(1), because a STREAM * socket is used instead of datagrams for each * call to gethostbyname().
Page 105
Using Internet Datagram Sockets Example Using Datagram Sockets sendto (s, &reqaddr, sizeof(struct in_addr), 0, &clientaddr_in, addrlen); default: /* Parent process comes here. */ exit(0); C L I E N T . U D P * This is an example program that demonstrates the use of * datagram sockets as an BSD Sockets mechanism.
Page 106
Using Internet Datagram Sockets Example Using Datagram Sockets struct in_addr reqaddr; /* for returned internet address */ #define ADDRNOTFOUND 0xffffffff /* value returned for unknown host */ #define RETRIES 5 /* # of times to retry before giving up */ H A N D L E R This routine is the signal handler for the alarm signal.
Page 107
Using Internet Datagram Sockets Example Using Datagram Sockets exit(1); servaddr_in.sin_addr.s_addr = ((struct in_addr *) (hp->h_addr))->s_addr; /* Find the information for the ”example” server * in order to get the needed port number. sp = getservbyname (”example”, ”udp”); if (sp == NULL) { fprintf(stderr, ”%s: example not found in /etc/services\n”, argv[0]);...
Page 108
Using Internet Datagram Sockets Example Using Datagram Sockets if (recv (s, &reqaddr, sizeof(struct in_addr), 0) == -1) { if (errno == EINTR) { /* Alarm went off & aborted the receive. * Need to retry the request if we have * not already exceeded the retry limit.
Advanced Topics for Internet Datagram Sockets SO_BROADCAST Socket Option SO_BROADCAST Socket Option This option is AF_INET socket-specific. SO_BROADCASTADDR establishes permission to send broadcast datagrams from the socket. Chapter 5...
Advanced Topics for Internet Datagram Sockets Specifying a Default Socket Address Specifying a Default Socket Address It is possible (but not required) to specify a default address for a remote datagram socket. This allows you to send messages without specifying the remote address each time.
Advanced Topics for Internet Datagram Sockets Specifying a Default Socket Address Include files: #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> System call: connect(s,addr,addrlen) int s; struct sockaddr*addr; int addrlen; Description of Parameter INPUT Value Contents socket descriptor of local socket descriptor of socket socket requesting default peer address addr...
Advanced Topics for Internet Datagram Sockets Synchronous I/O Multiplexing with Select Synchronous I/O Multiplexing with Select The select system call can be used with sockets to provide a synchronous multiplexing mechanism. The system call has several parameters which govern its behavior. If you specify a zero pointer for the timeout parameter timout, select will block until one or more of the specified socket descriptors is ready.
Advanced Topics for Internet Datagram Sockets Sending and Receiving Data Asynchronously Sending and Receiving Data Asynchronously Asynchronous sockets allow a user program to receive an SIGIO signal when the state of the socket changes. This state change can occur, for example, when new data arrive.
Advanced Topics for Internet Datagram Sockets Sending and Receiving IP Multicast Datagrams Sending and Receiving IP Multicast Datagrams IP multicasting provides a mechanism for sending a single datagram to a group of systems. Normally, only systems that have joined the multicast group process the datagrams.
Page 117
Advanced Topics for Internet Datagram Sockets Sending and Receiving IP Multicast Datagrams Normally, multicast datagrams are sent only to systems directly connected to the same network that the sending interface is on. If multicast datagrams are intended for distant networks, a special multicast router must be present on the local and intermediate networks.
Advanced Topics for Internet Datagram Sockets Sending and Receiving IP Multicast Datagrams #include <netinet/in.h> unsigned char ttl = 64; setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); Note that ttl is an unsigned char. Any of the values 0 through 255 can be specified. If ttl is zero, the multicast is limited to the local system. If ttl is one, the multicast is limited to a local network.
Page 119
Advanced Topics for Internet Datagram Sockets Sending and Receiving IP Multicast Datagrams because the system uses some link-layer multicast addresses. For example, the E/ISA interface card is limited to 16 multicast addresses, and the system uses two of those. So all applications in the system can join at most 14 unique multicast groups on each E/ISA interface.
Page 120
Advanced Topics for Internet Datagram Sockets Sending and Receiving IP Multicast Datagrams Note that imr_interface must match the field that was used when the IP_ADD_MEMBERSHIP socket option was specified for imr_multiaddr. Sharing a Multicast Port SO_REUSEPORT If more than one application may bind to the same port number on a system, each application must set the SO_REUSEPORT socket option before binding to the port.
Advanced Topics for Internet Datagram Sockets Nonblocking I/O Nonblocking I/O Sockets are created in blocking mode I/O by default. You can specify that a socket be put in nonblocking mode by using the ioctl system call with the FIOSNBIO request. An example usage of this call is: #include<sys/ioctl.h>...
Advanced Topics for Internet Datagram Sockets Using Broadcast Addresses Using Broadcast Addresses In place of a unique internet address or the wildcard address, you can also specify a broadcast address. A broadcast address is an internet address with a local address portion of all 1s. If you use broadcast addressing, be careful not to overload your network.
Using UNIX Domain Stream Sockets This chapter describes creating a UNIX Domain stream socket connection between two processes executing on the same node.
Using UNIX Domain Stream Sockets Overview Overview UNIX Domain (AF_UNIX) stream sockets provide bidirectional, reliable, unduplicated flow of data without record boundaries. They offer significant performance increases when compared with the use of local internet (AF_INET) sockets, due primarily to lower code execution overhead.
Page 125
Using UNIX Domain Stream Sockets Overview Client System Server Process System Call Process Call Used Activity Used Activity send data write() or send() receive data read() or recv() disconnect disconnect socket shutdown() shutdown() socket or close() (optional) or close() (optional) Each of these steps or activities is described in more detail in the following sections.
Using UNIX Domain Stream Sockets Preparing Address Variables Preparing Address Variables Before you begin to create a connection, establish the correct variables and collect the information that you need to request a connection. Your server process needs to: • Declare socket address variables. •...
Page 127
Using UNIX Domain Stream Sockets Preparing Address Variables The server process only needs an address for its own socket. Your client process will not need an address for its own socket. Chapter 6...
Using UNIX Domain Stream Sockets Writing the Server Process Writing the Server Process This section explains the calls your server process must make to connect with and serve a client process. Creating a Socket The server process must call socket to create a communication endpoint.
Using UNIX Domain Stream Sockets Writing the Server Process Binding a Socket Address to the Server Process's Socket After your server process has created a socket, it must call bind to bind a socket address. Until an address is bound to the server socket, other processes have no way to reference it.
Using UNIX Domain Stream Sockets Writing the Server Process Setting the Server Up to Wait for Connection Requests Once your server process has an address bound to it, it must call listen to set up a queue that accepts incoming connection requests. The server process then monitors the queue for requests (using select(2) or accept ).
Using UNIX Domain Stream Sockets Writing the Server Process Accepting a Connection The server process can accept any connection requests that enter its queue after it executes listen. accept creates a new socket for the connection and returns the socket descriptor for the new socket. The new socket: •...
Page 132
Using UNIX Domain Stream Sockets Writing the Server Process Function result: socket descriptor of new socket if accept is successful, –1 if failure occurs. Example: struct sockaddr_un peeraddr; addrlen = sizeof(sockaddr_un); s = accept (ls, &peeraddr, &addrlen); There is no way for the server process to indicate which requests it can accept.
Using UNIX Domain Stream Sockets Writing the Client Process Writing the Client Process This section discusses the calls your client process must make to connect with and be served by a server process. Creating a Socket The client process must call socket to create a communication endpoint. socket and its parameters are described in the following table.
Using UNIX Domain Stream Sockets Writing the Client Process Requesting a Connection Once the server process is listening for connection requests, the client process can request a connection with the connect call. connect and its parameters are described in the following table. Include files: #include <sys/types.h>...
Page 135
Using UNIX Domain Stream Sockets Writing the Client Process When to Request a Connection The client process should request a connection after socket is created and after server socket has a listening socket. Refer to the connect(2) man page for more information on connect. Chapter 6...
Using UNIX Domain Stream Sockets Sending and Receiving Data Sending and Receiving Data After the connect and accept calls are successfully executed, the connection is established and data can be sent and received between the two socket endpoints. Because the stream socket descriptors correspond to HP-UX file descriptors, you can use the read and write calls (in addition to send and recv) to pass data through a socket-terminated channel.
Using UNIX Domain Stream Sockets Sending and Receiving Data Function result: number of bytes actually sent, –1 if failure occurs. Example: count = send (s, buf, 10, 0); send blocks until the specified number of bytes have been queued to be sent, unless you are using nonblocking I/O.
Using UNIX Domain Stream Sockets Sending and Receiving Data No more than len bytes of data are received. If there are more than len bytes of data on the socket, the remaining bytes are received on the next recv. Flag Options There are no flag options for UNIX Domain (AF_UNIX) sockets.
Using UNIX Domain Stream Sockets Closing a Socket Closing a Socket In most applications, you do not have to worry about cleaning up your sockets. When you exit your program and your process terminates, the sockets are closed for you. If you need to close a socket while your program is still running, use the close system call.
These programs are provided as examples only of UNIX Domain stream NOTE socket usage and are not Hewlett-Packard supported products. These programming examples demonstrate how to set up and use UNIX Domain stream sockets. These sample programs can be found in the /usr/lib/demos/networking/af_unix directory.
Page 141
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets cc = send(fd, buf, buflen, 0); if (cc == -1) { perror(”send”); exit(0); buf += cc; buflen -= cc; recv_data(fd, buf, buflen) char *buf; int cc; while (buflen > 0) { cc = recv(fd, buf, buflen, 0);...
Page 142
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets perror(”catch - socket failed”); exit(0); bufsize = BUFSIZE; * Use setsockopt() to change the socket buffer size to improve * throughput for large data transfers if ((setsockopt(s, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize))) == -1) { perror(”catch - setsockopt failed”);...
Page 143
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets send_data(ns, &bullet, sizeof(struct bullet)); cc = 0; if (counter_pid) kill(counter_pid, SIGUSR1); if (gettimeofday(&tp1, &tzp) == -1) { perror(”catch time of day failed”); exit(0); * Receive data from the client total = 0;...
Page 144
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets PITCH - SEND DATA TO THE CATCHER Pitch and catch set up a simple unix domain stream socket client-server connection. The client (pitch) then sends data to the server (catch), throughput is calculated, and the result is printed to the client's stdout.
Page 145
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets * The SIGPIPE signal will be received if the peer has gone away * and an attempt is made to write data to the peer. Ignoring * the signal causes the write operation to receive an EPIPE error. * Thus, the user is informed about what happened.
Page 146
Using UNIX Domain Stream Sockets Example Using UNIX Domain Stream Sockets if (gettimeofday(&tp1, &tzp) == -1) { perror(”pitch time of day failed”); exit(0); i = bytes; total = 0; * Send the data while (i > 0) { cc = sendsize < i ? sendsize : i; send_data(s, buffer, cc);...
Using UNIX Domain Datagram Sockets Overview Overview The UNIX Domain only allows communication between processes executing on the same machine. In contrast to pipes, it does not require the communicating processes to have common ancestry. For more information on the UNIX Domain protocol, refer to the unix(7p) man page.
Page 149
Using UNIX Domain Datagram Sockets Overview Table 7-1 Exchanging Data Between UNIX Domain Datagram Sockets Client System Server Process System Call Process Call Used Activity Used Activity create a socket create a socket socket() socket() bind a socket bind a socket bind() bind() send message...
Using UNIX Domain Datagram Sockets Preparing Address Variables Preparing Address Variables Before your client process can make a request of the server process, you must establish the correct variables and collect the information you need about the server process. Your server process needs to: •...
Page 151
Using UNIX Domain Datagram Sockets Preparing Address Variables The server process only needs one address for its socket. Any process that knows the address of the server process can then send messages to it. Thus, your client process needs to know the address of the server socket.
Using UNIX Domain Datagram Sockets Writing the Server and Client Processes Writing the Server and Client Processes This section discusses the calls your server and client processes must make. Creating Sockets Both processes must call socket to create communication endpoints. socket and its parameters are described in the following table.
Using UNIX Domain Datagram Sockets Writing the Server and Client Processes Binding Socket Addresses to UNIX Domain Datagram Sockets After your server process has created a socket, it must call bind to bind a socket address. Until the server socket is bound to an address, other processes have no way to reference it.
Page 154
Using UNIX Domain Datagram Sockets Writing the Server and Client Processes strcpy(servaddr.sun_path, SOCKET_PATH); unlink(SOCKET_PATH); bind(s, &servaddr, sizeof(struct sockaddr_un)); When to Bind Socket Addresses The server process should bind socket addresses after socket is created and before any other BSD Sockets system calls. Refer to the bind(2) man page for more information on bind.
Using UNIX Domain Datagram Sockets Sending and Receiving Messages Sending and Receiving Messages The sendto and recvfrom (or sendmsg and recvmsg) system calls are usually used to transmit and receive messages with datagram sockets. Sending Messages Use sendto or sendmsg to send messages. sendmsg is similar to sendto, except sendmsg allows the send data to be gathered from several buffers.
Using UNIX Domain Datagram Sockets Sending and Receiving Messages Function result: number of bytes actually sent if sendto succeeds, -1 if sendto call fails. Example: struct sockaddr_un servaddr; count = sendto(s, argv[2], strlen(argv[2]), 0, &servaddr, sizeof(struct sockaddr_un); When to Send Data The server or client process should send data after server has bound to an address.
Page 157
Using UNIX Domain Datagram Sockets Sending and Receiving Messages OUTPUT Parameter Contents INPUT Value Value socket socket descriptor unchanged descriptor of of socket receiving local socket the message pointer to data pointer to buffer pointer to buffer that is to receive received data data maximum...
Page 158
Using UNIX Domain Datagram Sockets Sending and Receiving Messages message is in the queue, it is not affected. Therefore, the best technique is to receive as much as possible on each call. Refer to the recv(2) man page for more information on recvfrom and recvmsg. Chapter 7...
Using UNIX Domain Datagram Sockets Closing a Socket Closing a Socket In most applications, you do not have to close the sockets. When you exit your program and your process terminates, the sockets are closed for you. If you need to close a socket while your program is still running, use the close system call.
These programs are provided as examples only of UNIX Domain NOTE datagram socket usage and are not Hewlett-Packard supported products. These programming examples demonstrate how to set up and use UNIX Domain datagram sockets. These sample programs can be found in the /usr/lib/demos/networking/af_unix directory.
Page 161
Using UNIX Domain Datagram Sockets Example Using UNIX Domain Datagram Sockets alarm((unsigned long) 120); Create a UNIX datagram socket for server if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) { perror(”server: socket”); exit(1); Set up address structure for server socket bzero(&servaddr, sizeof(servaddr));...
Programming Hints This chapter contains information for: • Troubleshooting. • Using diagnostic utilities as troubleshooting tools.
Page 166
Programming Hints • Adding a server process to the internet daemon. • Summary tables for system and library calls. • Portability issues. Chapter 8...
Programming Hints Troubleshooting Troubleshooting The first step to take is to avoid many problems by using good programming and debugging techniques. Your programs should check for a returned error after each system call and print any that occur. For example, the following program lines print an error message for read: cc=read(sock,buffer,1000);...
Programming Hints Using Diagnostic Utilities as Troubleshooting Tools Using Diagnostic Utilities as Troubleshooting Tools You can use the following diagnostic utilities to help debug your programs. It is helpful if you have multiple access to the system so you can obtain information about the program while it is running. Use ping to verify the physical connection with the ping destination node.
Programming Hints Adding a Server Process to the Internet Daemon Adding a Server Process to the Internet Daemon This section contains example BSD Sockets programs that use the internet daemon, called inetd. For more information on inetd, refer to the inetd(1M) man page. You can invoke the example server programs from inetd if you have super-user capabilities and you make the following configuration modifications:...
Page 170
Programming Hints Adding a Server Process to the Internet Daemon M A I N This is the actual server routine that the /etc/inetd forks to handle each individual connection. Its purpose is to receive the request packets from the remote client, process them, and return the results to the client.
Page 171
Programming Hints Adding a Server Process to the Internet Daemon exit (0); S E R V E R . U D P This is a variation of the example program called serv.udp. This one performs the same function, except that it is designed to be called from /etc/inetd.
Page 172
Programming Hints Adding a Server Process to the Internet Daemon * BUFFERSIZE - 1 bytes are read so that * room is left at the end of the buffer * for a null character. cc = recvfrom(0, buffer, BUFFERSIZE - 1, 0 &clientaddr_in, &addrlen);...
Programming Hints Summary Tables for System and Library Calls Summary Tables for System and Library Calls The following table contains a summary of the BSD Sockets system calls. Table 8-1 BSD Sockets System Calls System Call Description Creates a socket, or communication endpoint for the socket calling process.
Page 174
Programming Hints Summary Tables for System and Library Calls System Call Description Gets the socket address of the specified socket. getsockname Gets, or sets, the options associated with a socket. getsockopt, setsockopt Gets the name of the peer socket connected to the getpeername specified socket.
Page 175
Programming Hints Summary Tables for System and Library Calls System Call Description Can be used to improve efficiency for a process that select accesses multiple sockets or other I/O devices simultaneously. Refer to the sections on “Synchronous I/O Multiplexing with Select.” Can be used for finding the number of receivable ioctl bytes with FIONREAD and for setting the...
Page 176
Programming Hints Summary Tables for System and Library Calls Table 8-3 Library Calls Library Call Description internet address manipulation routines inet_addr inet_lnaof inet_makeaddr inet_netof inet_network get or set service entry setservent endservent getservbyname getservbyport getservent get or set protocol entry setprotoent endprotoent getprotobyname...
Programming Hints Portability Issues Portability Issues This section describes implementation differences between 4.3 BSD Sockets and HP-UX IPC. It contains porting issues for: • IPC functions and library calls. • Other functions and library calls typically used by IPC programs. Because HP-UX IPC is based on 4.3 BSD Sockets (it is a subset of 4.3 BSD), programs should port easily between HP-UX and 4.3 BSD systems.
Page 178
Programming Hints Portability Issues FIONREAD Return Values For HP-UX systems, the FIONREAD ioctl request on a datagram socket returns a number that may be larger than the number of bytes actually readable. Previously, HP-UX systems returned the maximum number of bytes that a subsequent recv would be able to return. Listen's Backlog Parameter HP-UX sets the actual size of the queue for pending connections to 3/ 2*B+1, where B is the backlog value specified in the listen()
Page 179
Programming Hints Portability Issues Utmp The 4.3 BSD /etc/utmp file format is incompatible with the HP-UX implementation. The HP-UX implementation uses UNIX System V compatible calls. Refer to the utmp(4) man page for details. Library Equivalencies Certain commonly used library calls in 4.3 BSD are not present in HP- UX systems, but they do have HP-UX equivalents.
BSD Sockets Quick Reference Table Quick Reference Table Quick Reference Table Release 10.10 of the HP-UX operating system supports two variations of sockets--HP-UX BSD Sockets and X/Open Sockets. To use X/Open sockets, users must make an addition to their make files by including the “-l xnet”...
Page 183
BSD Sockets Quick Reference Table Quick Reference Table HP-UX X/Open getpeername getpeername int getpeername (int socket, void int getpeername (int socket, struct *address, int *address_len); sockaddr *address, size_t *address_len); getsockname getsockname int getsockname (int socket, void int getsockname (int socket, struct *address, int *address_len);...
Page 187
Glossary The address Address family: ARPA/Berkeley Services: format used to interpret The set of services originally addresses specified in socket developed for use on the operations. The internet ARPANET (i.e., telnet(1)) or address family (AF_INET) is distributed with the Berkeley supported.
Page 188
Glossary UNIX software released by the pair of sockets at either end of University of California at the connection. Berkeley. See also, “Association.” Binding: Establishing the Daemon: A software process address of a socket which that runs continuously and allows other sockets to connect provides services on request.
Page 189
Glossary services. Organization: Called “ISO,” this organization created a Domain: A set of allowable network model that identifies names or values. See also, the seven commonly-used “Communication domain.” protocol levels for networking. File Transfer Protocol: The Internet: All ARPA networks file transfer protocol that is that are registered with the traditionally used in ARPA...
Page 190
Glossary IPC: transmitted between processes. See Interprocess Communication. Also called a “frame.” ISO: See International Standards Peer: An Interprocess Organization. Communication socket at the other end of a connection. Link-level address: A six- byte quantity that is distinct Port: An address within a host from the internet address and that is used to differentiate is the unique address of the...
Page 191
Glossary Socket: Addressable entities sequence sent. Stream sockets that are at either end of an use the TCP protocol. Interprocess Communication TCP: connection. A socket is See Transmission Control Protocol. identified by a socket descriptor. A program can write Telnet: A virtual terminal data to and read data from a protocol traditionally used on socket, just as it writes and...
Page 192
Glossary processes executing on the same node and using the AF_UNIX socket address family. User Datagram Protocol: A protocol that provides the underlying communication support for datagram sockets. UDP is an unreliable protocol. A process receiving messages on a datagram socket could find that messages are duplicated, out-of-sequence or missing.
Page 194
Index BSD IPC connections LINGER options SO_DONTROUTE BSD IPC system calls listensbacklogparameter" SO_KEEPALIVE using datagram message SO_LINGER sockets MSG_OOB SO_RCVBUF channel MSG_PEEK SO_REUSEADDR client nonblocking I/O SO_SNDBUF client-server model nondestructive read sockaddr closing a socket other system calls sockaddr_in out of band data socket address communication domain out-of-band data...
Page 195
Index preparing address variables specifying default socket address O_NDELAY sockaddr_un summary table O_NONBLOCK ioctl rindex out of band data IP multicasting IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP select packet IP_MAX_MEMBERSHIPS send pathname IP_MULTICAST_IF domain stream sockets peer IP_MULTICAST_LOOP perror IP_MULTICAST_TTL Internet datagram sockets ping IPC connections Internet stream sockets port...