Цитата(romez777 @ Oct 12 2005, 15:02)
Код
const int port = 5000;
...
/* fill in structure */
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
1. Я вам не зря показывал заполнение - заполните поле длины: в некоторых реализациях без неё проходило (в Linux, но это зависит от верс. стека-ядра - оно вам надо?) ... но строго по POSIX (или по У.Стивенсу

) - она должна быть заполнена:
Код
/* fill in structure */
serv_addr.sin_len = sizeof( serv_addr );
2. И порт какой-то странненький (маленький, из well-known) - вы уверены, что на нём не сидит какая-то из служб, работающих в вашей конфигурации OS?
Цитата(romez777 @ Oct 12 2005, 15:02)
"Ругается периодически" в том смысле, что я не заметил пока какой-то закономерности

Всегда запускается только одна копия, сервер построен на основе fork()'ов, треды не применяются. Мне также рекомендовали посмотреть на опцию SO_REUSEPORT, но в моем линуксе ее не нашел, наверное платформенно-зависимый параметр.
3. То, что fork() или pthread_create() - это значения не имеет, "что в лоб, что по-лбу" - одно и тоже... но если вы в разных ветках fork() хотите открыть сокеты с одинаковыми параметрами (внешними) - этот номер не проходит, здесь и SO_REUSEADDR вам не поможет... да и зачем: я, как понял по INADDR_ANY - это у вас сервер? сервер по bind() создаёт единый экземпляр прослушивающего сокета, а каждая ветка fork() получает по accept()
свою копию связанного сокета, имеющие те-же внешние параметны (адрес, порт) - с ними и работаете...
Или я чего-то не так понял
4. Посмотрте те URL, что я назвал ... там рядом есть готовые проекты 7-ми серверов, принципиально разной структуры, со сравнением результатов:
http://qnxclub.net/files/articles/EchSrv/echsrv.tgz