Hacker News new | past | comments | ask | show | jobs | submit login
Beej's Guide to Network Programming (beej.us)
245 points by alanthonyc on Feb 18, 2013 | hide | past | favorite | 47 comments



When I was at university I wanted to take a class that had 'introduction to computer networks' as a prerequisite, but I didn't want to wait 2 semesters for it to come around again after taking networks first. I spoke to the professor and he said he'd let me enroll in the course if I promised to carefully read Beej's guide first, since it contains all the essentials I'd really need for this follow-on. So, this saved me 6 months, what a golden nugget!


Same here. My course was a simple one and didn't include network programming, and at the same time I was learning about select() and co in C. This was a great primer especially for me as I had some Python knowledge; it really helped with understanding network programming at a lower level.

Even if you don't code the examples, reading them will give you so much information.


+1, The same happened with me too. In my university, the professor teaching Computer Networks never understood about computer networks, forget UNIX, he used to come to class mugging some programs up. This guide helped a lot to start with UNIX, I was so overwhelmed that i went on and sent fan mail to beej xD.


Still not updated to mention anything more than select() as far as non-blocking IO is concerned, like poll, epoll, or, god no, using an abstract event loop. Nobody who cares about their code and sanity does blocking I/O with sockets.

But then, I must confess I too started network programming with this guide :) It presents the basics nicely, but there's a lot more you should learn about network programming.


It looks like he did put in a blurb about using libevent in order to use a more modern syscall under the hood - it's disappointing though that he didn't explain why epoll and kqueue are better though, people who are new to this would be much better served by that than by any code samples involving select().


Are you saying "god no" to using an abstract event loop? If so, why? (I've been using libuv for a project, so far so good.)


No, of course not, I was just referring the the reluctance of the book to get modernized. I can't possibly imagine not using an abstract event loop.


Ah, "God forbid"--gotcha.


Is there a similar or updated guide some place which includes non-blocking i/o?


Check out "The C10K Problem" (http://www.kegel.com/c10k.html) for a high level discussion of some techniques for high performance servers.

For basic info on Epoll: http://www.devshed.com/c/a/BrainDump/Linux-Files-and-the-Eve... epoll socket tutorial: http://kovyrin.net/2006/04/13/epoll-asynchronous-network-pro...

Or kqueue if your OS supports it: http://wiki.netbsd.org/tutorials/kqueue_tutorial/

Lower level details on level triggered vs edge triggered interrupts: http://en.wikipedia.org/wiki/Interrupt#Level-triggered

Overview of the thundering herd problem: http://www.citi.umich.edu/projects/linux-scalability/reports...


Take a look at lthread http://github.com/halayli/lthread


There is http://www.wangafu.net/~nickm/libevent-book/ which is useful even if you are not using libevent (which most of the cool kids are)


Some of those cool kids should take a look at libev: http://software.schmorp.de/pkg/libev.html



it's a shortcut to learn basic network programming with sockets, without spending too much time on it. Anyone more than casually serious about it should consider looking at Richard Stevens books, Unix network programming and TCP/IP illustrated (esp. volume 2).


I'm shocked that you are the only one to mention rstevens, It won't be far fetched if Beej learned from rstevens.


For this community, I would have thought this is a bit like seeing a link to Google.com on the HN front page. Beej's guide is staple internet fodder.


This was an absolute lifesaver when I was thrown into the deep end writing a high-performance TCP server from scratch. I think it's so effective because it's "highly opinionated", which is to say, he points out "Foo does this, but don't use it because that's just silly" or "don't use bar, use baz instead because it handles qux more easily" and so on.


what makes this stuff seem "high-performance" TCP to you? This is standard socket programming. High performance TCP server is when you actually roll out your own TCP stack.


Fair enough, to be honest the tcp part was not really the bottleneck. But servicing multiple incoming streams without starving any is really what i meant.


If I'm not mistaken this original document was on Chico State's computer science domain. It was my understanding Beej went to Chico; does anyone know for sure? This was around long before 2006, I remember reading it around the year 2000 when I was first getting into C++. (miracle this quality of a document escaped anyone's brain in Chico -- I know, I went to CSUC. Let's just say it was hard to concentrate there :)


I also remember seeing this around the year 2000. (One giveaway that it's written in a previous century: It mentions SunOS. Not Solaris, but SunOS. When's the last time you heard somebody talk about that?) At that point I was already familiar with sockets, and mainly found the guide memorable because the name "Beej" had a weird sound to it.


Chico does sound familiar for some reason, with regard to this guide (I also recall reading it many years ago, probably a decade ago or more). I skimmed through it quickly for a version history but didn't see one.


Yep, he went to Chico from 1993 to 1997 according to his LinkedIn profile: https://www.linkedin.com/in/brianhall


I'm curious as to why its hard to concentrate, is it a party school or does it have its own beach like UCSB or what?


Party school.


He did indeed. Chico State's CSCI program was actually very good in the early 90s.


This is one of those priceless documents that served me well, and which I have recommended to many others as a great starting place.


Still refer to it every so often, especially as backup documentation from the man pages when something isn't entirely clear.


learning from this now. glad its got all this credibility! (context: college operating systems course)


If you want to learn about some more advanced strategies, you may also benefit from this classic: http://www.kegel.com/c10k.html


Like others, this is how i learned to do it too. The C programming guide is very good too


I owe this guy my entry into network programming and eventually security.


I owe him the implementation details part of my networking code for my game from 5~ years back.


lol soooo retro! brings back memories almost 10 years old. i used it as a guideline for writing an SMS notifier on incoming e-mails through free HTTP SMS service. with auth. ;)


+1 !!

This is the number one thing that got me through network class back in university. Next to that is the professor's office hour. I don't think I even touched the textbook.


Is there an even better, more modern networking guide that's free (or not)? Does anyone have a list of networking reference/tutorial/introduction material?


Wow, I am glad that this is still around - the first tutorial that I learned socket and network programming back in 2004.


Its nice to know other guys learned from this as well. Makes me feel that what I learned back in college was legit.


This saved me when I had to write a P2P file distribution system for a project in college.


This was the go-to guide back in its times. Circa 2006?


This was my first look at networking. Worked for me.


I learned from this in 2006-2007.


truely classics. i learned network programming from this guide a decade ago.


A reference for beginners!


At first, I was confused, thinking that the porn site beeg.com posted a networking tutorial.


This is how I learned to do it.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: