When I took part in a training last year, I heard about netcat for the first time. During that class, the tutor showed some hacks and tricks of using
netcat which appealed to me and motivated me to learn the guts of it. Fortunately, in the past
2 months, I was not so busy that I can spend my spare time to dive into
netcat source code, and got abundant byproducts during this process.
(1) Brush up socket programming. I wrote my first network application more than
10 years ago, and always think the socket
APIs are marvelous. Just
~10 functions (
accept…) with some IO multiplexing buddies (
epoll…) connect the whole world, wonderful! From that time, I developed a habit that is when touching a new programming language, network programming is an essential exercise. Even though I don’t write socket related code now, reading
netcat socket code indeed refresh my knowledge and teach me new stuff.
(2) Write a tutorial about
netcat. I am mediocre programmer and will forget things when I don’t use it for a long time. So I just take notes of what I think is useful. IMHO, this “tutorial” doesn’t really mean teach others something, but just a journal which I can refer when I need in the future.
(3) Submit patches to
netcat. During reading code, I also found bugs and some enhancements. Though trivial contributions to
OpenBSD, I am still happy and enjoy it.
(4) Implement a
C++ encapsulation of libtls.
tls/ssl connection, but it needs you take full care of resource management (
socket, etc), otherwise a small mistake can lead to resource leak which is fatal for long-live applications (In fact, the two bugs I reported to
OpenBSD are all related resource leak). Therefore I develop a simple
C++ library which wraps the
libtls and hope it can free developer from this troublesome problem and put more energy in application logic part.
Long story to short, reading classical source code is a rewarding process, and you can consider to try it yourself.