Per scrivere codice basato sui socket in C che sia "bug-free", efficiente, portabile, (aggiungi qui caratteristiche positive), sono necessari anni di studio, considera che la maggior parte del codice di rete presentato in corsi universitari, tutorial e spesso anche nei libri è di qualità molto opinabile.
Per questo motivo un principiante non dovrebbe scontrarsi con le complicazioni dei socket a meno che non sia costretto.
Le librerie ad alto livello ti permettono di concentrarti sul problema da risolvere, difficilmente un programmatore alle prime armi può fare di meglio rispetto a quanto viene reso disponibile da linguaggi più moderni del C: per esempio Java, Python e C#.
Tutti, a parte il C, prevedono delle librerie per la programmazione di rete che non ti costringono a lavorare a basso livello (ma volendo puoi farlo comunque).
Per esempio questo è un server di chat con supporto per molteplici client realizzato con Python+Twisted, prova a scrivere l'analogo in C:
codice:
"""The most basic chat protocol possible.
run me with twistd -y chatserver.py, and then connect with multiple
telnet clients to port 1025
"""
from twisted.protocols import basic
class MyChat(basic.LineReceiver):
def connectionMade(self):
print "Got new client!"
self.factory.clients.append(self)
def connectionLost(self, reason):
print "Lost a client!"
self.factory.clients.remove(self)
def lineReceived(self, line):
print "received", repr(line)
for c in self.factory.clients:
c.message(line)
def message(self, message):
self.transport.write(message + '\n')
from twisted.internet import protocol
from twisted.application import service, internet
factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []
application = service.Application("chatserver")
internet.TCPServer(1025, factory).setServiceParent(application)