|[ Team LiB ]|
There are three main ways to set a time limit on a socket operation:
The first is easy to use, but involves signal handling, and as we will see in Section 20.5, can lead to race conditions. Using select means that we block in this function with its provided time limit instead of blocking in a call to read, write, or connect. The third alternative, to use the new socket options, is also easy, but is not provided by all implementations.
recvmsg and sendmsg are the most general of the five groups of I/O functions provided. They combine the ability to specify an MSG_xxx flag (from recv and send), plus employ the ability to return or specify the peer's protocol address (from recvfrom and sendto), with the ability to use multiple buffers (from readv and writev), along with two new features: returning flags to the application and receiving or sending ancillary data.
We describe ten different forms of ancillary data in the text, six of which are new with IPv6. Ancillary data consists of one or more ancillary data objects, each object preceded by a cmsghdr structure specifying its length, protocol level, and type of data. Five functions beginning with CMSG_ are used to build and parse ancillary data.
Sockets can be used with the C standard I/O library, but doing this adds another level of buffering to that already being performed by TCP. Indeed, a lack of understanding of the buffering performed by the standard I/O library is the most common problem with the library. Since a socket is not a terminal device, the common solution to this potential problem is to set the standard I/O stream to unbuffered, or to simply avoid standard I/O on sockets completely.
Many vendors provide advanced ways to poll for many events without the overhead required by select and poll. While writing nonportable code should be avoided whenever possible, sometimes the benefits of performance improvements outweigh the risk of nonportability.
|[ Team LiB ]|