Программирование на языке C, проблемы с select () и fd_set - PullRequest
1 голос
/ 29 марта 2010

Я изучаю свой способ программирования сокетов в C (имеется в виду Beej).

Вот простой многопользовательский сервер чата, который я пытаюсь реализовать: http://pastebin.com/gDzd0WqP

Во время выполнения выдает ошибку шины. Это идет по линиям 68-78.

Помогите мне отследить источник проблемы?

на самом деле, ПОЧЕМУ мой код даже достигает этого конкретного региона? Я только что запустил сервер. клиенты не подключались ..: @

ps - я знаю, что мой код крайне ненадежен (нигде нет проверок на ошибки), но я БУДУ это делать на более позднем этапе, я просто хочу проверить функциональность кода перед его реализацией во всей красе;) *

Ответы [ 2 ]

3 голосов
/ 29 марта 2010

строка 81

msg[MSG_SIZE] = '\0';` 

переполняет ваш буфер. Сделай это

msg[MSG_SIZE - 1] = '\0';` 

Вам также нужно , чтобы проверить возвращаемое значение всех вызовов, которые могут потерпеть неудачу, это строки 39,42,45,68 и 80

Редактировать: И если вы проверили ошибки, скорее всего, вы видели сбой вызова accept (), вероятно, из-за того, что сокет не находится в режиме прослушивания - то есть вы пропускаете вызов listen()

1 голос
/ 30 марта 2010

Еще одна вещь, которую следует учитывать, это то, что вы не можете обязательно скопировать fd_set переменные простым присваиванием. Единственный переносимый способ справиться с ними - это восстановить fd_set с нуля, каждый раз просматривая список активных файловых дескрипторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...