Networking in C for linux seems overly complicated. Why did they make it so complicated?