Un errore è qua:

codice:
server_address.sin_addr.s_addr = htons(INADDR_ANY);
La htons serve per cambiare l' ordine dei bit di un valore nell' ordine in cui deve essere inviato.
sin_addr.s_addr non è un dato che deve essere inviato, è una costante che ti restituisce un indirizzo IP valido, per cui non c'è bisogno di alcuna conversione:

codice:
server_address.sin_addr.s_addr = INADDR_ANY;
Questo è un errore, ce ne potrebbero essere altri (posta in tal caso).
Ma faresti bene a gestire gli errori, ovvero ogni volta che usi funzione come la socket, la bind, ecc ... controlla che il valore ritornato non sia minore di zero, se è minore di zero usa perror per stampare l' errno ottenuto.