BSD Sockets Programming From A Multi-Language Perspective,
Jones, M. Tim
Dan Weeks, 14 November 2003
Introduction
A few weeks ago there was a
post on the OpenBSD Journal
about a new book on network programming. My interest was piqued as
I've done a fair amount of network programming in the past, but I had
a desire get back up to speed with it after a hiatus due to moving
and changing jobs. With that in mind I ordered BSD
Sockets Programming From A Multi-Language Perspective
(hereafter referred to as just BSP) so I
could refresh my skills.
The generally accepted Application Program Interface (API) for
network programming is the BSD Sockets API. This API is available in
most programming languages that offer networking and is very similar
between most implementations. There are programmers that can go a
whole career without ever writing one lick of networking code. This
is not a bad thing, but it reflects that while using networked
applications is commonplace, developing them isn't necessarily
something that every developer will do. However, if a programmer is
interested in developing networking code in one of several languages
then BSP is probably a good book to start with.
What's Inside
With every book that is trying to introduce a new user to concepts
it's best to have clear examples of the subject matter and
BSP is no slouch in that department. The book is
divided into three sections, an introduction to network programming,
sockets programming from a multi-language perspective, and software
patterns from a multi-language perspective, giving the user not only
a structured experience but also a good set of things they can turn
back to in the future when they are utilizing what they've learned.
In part one the networking model and all its layers are clearly
explained. Also discussed are Internet protocols, methods of
communication, and the model for socket programming. Jones then
proceeds to build up sockets piece by piece through code examples.
He starts simple, giving the reader all they need to build a network
application in perfectly sized chunks. By only giving the user the
fundamental parts of socket programming (socket(), bind(), listen(),
accept(), etc.) the user is made familiar with the concepts and
work flow of a client and a server communicating without getting
snowed over by too many details.
Later chapters in part one deal with more advanced topics of network
programming. More API calls (gethostbyname(), getsockopt(),
setsockopt(), etc.) are discussed that allow the user better control
and more choices when creating their applications. The discussion on
socket options was particularly clear and enlightening as I was
refreshing my knowledge. After making sure the reader has a chance
to be well grounded in the sockets API Jones then delves into much
more heady topics, but things programmers need to know. Jones
presents a lot of good advice on advanced topics, optimizations, and
pitfalls that I know I have used or been bitten by in the past.
Part two of BSP is all about actually using socket
programming APIs in a variety of languages. The book covers C, Java,
Perl, Python, TCL, and Ruby and with each one being it's own chapter
it does a good job of binding the socket API from part one to a
specific implementation. Each chapter also has a nifty section where
the origin and heritage of the language is given.
The third and final part of the book is all about software patterns.
Many common topics are discussed including Stream, Datagram,
Broadcast, and Multicast clients and servers; a simple web server;
and a simple mail server. The strongest point of this section is
that each language has it's own chapter and each software pattern is
discussed and code given, a definite plus for readers.
The Bottom Line
People that are interested in getting into network programming using
BSD sockets need a place to start. BSD Sockets
Programming is that place. This book could easily function as
a textbook, although it seemed to go very fast for me (however it's
been a long while since I've been in class and I already knew network
programming going in). Clear wording and not overly complex
explanations also help in conveying the subject matter. Many
sections of BSP can make for a good reference for the
average programmer and having it around so that you could hand
to someone that is looking for information is always a plus.
Jones provides excellent code samples (I only found one errata in my
read of the entire book, an assignment rather than a comparison in an
if statement and the author was very quick and gracious in his reply)
and there is an included CD-ROM that has tools and code on it to make
it easier to get started. One of the things that impressed me the
most was the awesome attention Jones placed on network byte order
versus host byte order. He clearly explains the situation and why
programmers should care, and then proceeds to hammer the need to make
sure data values are in network byte order in a lot of the examples.
The only area that could have been better covered is pitfalls with
thread programming. There is a brief mention of it at one point in
the book, but then there is no mention of either how to determine if
parts of the sockets API is thread safe or thread safe alternatives
for some of the calls (granted, thread programming is outside the
scoop of BSP but even having a reference to some source
of thread and network programming would have been cool).
One caveat should be stated here: BSP is for IPv4
programming only. Let me say that again, if you are interested in
IPv6 programming you won't find this book useful at all. Now, there
are two points to consider here. First, IPv4 is still the prominent
mode of networking on the Internet at large. IPv6 just hasn't taken
hold yet. Second is that IPv4 is much easier to learn on and there
is no reason to cloud a persons learning by throwing multiple IP
protocols at them. The W. Richard Stevens book Unix Network
Programming, Volume 1 (which Jones references heavily)
is a much more appropriate book for IPv6, but it is also a much
more heady and complex book for a beginner. For those just
starting out with little or no knowledge of network programming
BSP is a better choice (then you can step up to the
UNPvol1 when you are ready).
Last modified: Fri Nov 14 15:10:39 PST 2003