1.   Intro

Hey! Socket programming got you down? Is this stuff just a little too difficult to figure out from the man pages? You want to do cool Internet programming, but you don't have time to wade through a gob of structs trying to figure out if you have to call bind() before you connect(), etc., etc.

Well, guess what! I've already done this nasty business, and I'm dying to share the information with everyone! You've come to the right place. This document should give the average competent C programmer the edge s/he needs to get a grip on this networking noise.

1.1. Audience

This document has been written as a tutorial, not a reference. It is probably at its best when read by individuals who are just starting out with socket programming and are looking for a foothold. It is certainly not the complete guide to sockets programming, by any means.

Hopefully, though, it'll be just enough for those man pages to start making sense... :-)

1.2. Platform and Compiler

The code contained within this document was compiled on a Linux PC using Gnu's gcc compiler. It should, however, build on just about any platform that uses gcc. Naturally, this doesn't apply if you're programming for Windows--see the section on Windows programming, below.

1.3. Official Homepage

This official location of this document is at California State University, Chico, at http://www.ecst.csuchico.edu/~beej/guide/net/.

1.4. Note for Solaris/SunOS Programmers

When compiling for Solaris or SunOS, you need to specify some extra command-line switches for linking in the proper libraries. In order to do this, simply add "-lnsl -lsocket -lresolv" to the end of the compile command, like so:
 
    $ cc -o server server.c -lnsl -lsocket -lresolv

If you still get errors, you could try further adding a "-lxnet" to the end of that command line. I don't know what that does, exactly, but some people seem to need it.

As I don't have a Sun box, I haven't tested any of the above information--it's just what people have told me through email.

1.5. Note for Windows Programmers

I have a particular dislike for Windows, and encourage you to try Linux, BSD, or Unix instead. That being said, you can still use this stuff under Windows.

First, ignore pretty much all of the system header files I mention in here. All you need to include is:
 
    #include <winsock.h> 

Wait! You also have to make a call to WSAStartup() before doing anything else with the sockets library. The code to do that looks something like this:
 
    #include <winsock.h>

    {
        WSAData wsaData;

        if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
            fprintf(stderr, "WSAStartup failed.\n");
            exit(1);
        } 

Once you do that, the rest of the examples in this tutorial should generally apply, with a few exceptions. For one thing, you can't use close() to close a socket--you need to use closesocket(), instead. Also, select() only works with socket descriptors, not file descriptors (like 0 for stdin).

To get more information about Winsock, read the Winsock FAQ and go from there.

1.6. Mirroring

You are more than welcome to mirror this site, whether publically or privately. If you publically mirror the site and want me to link to it from the main page, drop me a line at <beej@piratehaven.org>.

1.7. Note for Translators

If you want to translate the guide into another language, write me at <beej@piratehaven.org> and I'll link to your translation from the main page.

Feel free to add your name and email address to the translation.

1.8. Copyright and Distribution

Beej's Guide to Network Programming is Copyright © 1995-2001 Brian "Beej" Hall.

This guide may be freely reprinted in any medium provided that its content is not altered, it is presented in its entirety, and this copyright notice remains intact.

Educators are especially encouraged to recommend or supply copies of this guide to their students.

This guide may be freely translated into any language, provided the translation is accurate, and the guide is reprinted in its entirety. The translation may also include the name and contact information for the translator.

The C source code presented in this document is hereby granted to the public domain.

Contact <beej@piratehaven.org> for more information.

<<inapoi la documentatie<<