Ошибка: конечная точка транспорта уже подключена

Я пытаюсь разработать небольшой чат-сервер с C.

Для простого чат-сервера

  • (Конечная точка транспорта) === (сокет)?
  • Должен ли я использовать один сокет для каждого клиента, или я могу повторно использовать сокет для нескольких клиентов? Если да, то как?
  • Есть ли стандартный способ сделать это?
  • Любые хорошие ссылки доступны?

Могу ли я увидеть некоторые примеры реализации? Я должен использовать компилятор gcc и язык C для этого задания.


person Jaseem    schedule 21.08.2011    source источник
comment
Один вопрос на пост, пожалуйста. Можете ли вы выбрать только одну вещь, чтобы спросить о? В заголовке вашего поста есть очень хорошее, конкретное сообщение об ошибке, но тогда ваш пост совсем не об этом.   -  person John Zwinck    schedule 21.08.2011
comment
ладно, буду рад получить ответ на заголовок.. И да, тело натолкнуло меня на вопрос :)   -  person Jaseem    schedule 21.08.2011
comment
Если вы хотите, чтобы мы ответили на заглавный вопрос, как насчет того, чтобы отредактировать все остальные вещи из тела и заменить их чем-то, что поможет нам ответить на заглавный вопрос, например, какой код вы пытаетесь запустить, что приводит к этой ошибке?   -  person John Zwinck    schedule 21.08.2011
comment
@Джон Цвиник Ага! отредактировано. Нужна дополнительная информация? Что-либо ?   -  person Jaseem    schedule 21.08.2011


Ответы (2)


Вам нужен один сокет/клиент, и нет, вы не можете повторно использовать сокеты. Если вам нужно работать с несколькими клиентами, вы можете:

  • создайте один поток для каждого клиента и используйте блокирующий ввод-вывод (желательно с тайм-аутом).
  • создайте однопоточную программу и используйте демультиплексирование с помощью select/poll/epoll/kqueue и используйте неблокирующий ввод-вывод.
  • использовать асинхронный ввод-вывод.

Примеры взаимодействия с сокетом C Возможно, лучшим источником является книга Unix Network Programming. Он имеет достаточно примеров программ и пояснений.

person Karoly Horvath    schedule 21.08.2011
comment
Извините, но я думаю, что в том, что вы сказали, есть содержание, но я мало что понял! Я хотел бы сделать это многопоточным способом. - person Jaseem; 21.08.2011

  1. (Конечная точка транспорта) === (сокет)?

НЕТ. «Конечная точка» означает IP-адрес с номером порта. Сокет представляет собой один «сеанс», а сеанс состоит из двух конечных точек: локальной конечной точки (IP, порт) и удаленной конечной точки (IP, порт).

  1. Должен ли я использовать один сокет для каждого клиента, или я могу повторно использовать сокет для нескольких клиентов? Если да, то как?

Один сокет на один сеанс. Это означает, что серверу необходимо создать новый сокет для каждой удаленной конечной точки (клиента). Вы можете повторно использовать сокет, когда он больше не используется. Найдите параметр сокета SO_REUSEADDR.

  1. Есть ли стандартный способ сделать это?

Не уверен, что вы спрашиваете. Стандартный способ для службы чата или для модели сервер/клиент? Для службы чата ищите IRC. Модель программирования сервер/клиент хорошо документирована. Вы можете погуглить.

  1. Любые хорошие ссылки доступны?

http://beej.us/guide/bgnet/

Теперь, я думаю, вы понимаете, что означает сообщение об ошибке.

person young    schedule 21.08.2011
comment
Если я хочу непрерывно передавать данные с 1 клиента на 1 сервер (простые строки со стандартного ввода), как мне это сделать? - person Jaseem; 21.08.2011
comment
Почему бы вам не прочитать ссылку, которую я упомянул? beej.us/guide/bgnet/output/html/multipage/clientserver. html - person young; 22.08.2011
comment
Я на нем! сейчас просматриваю ссылку. - person Jaseem; 22.08.2011