Ошибка: «Конечная точка транспорта уже подключена» - PullRequest
2 голосов
/ 21 августа 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 21 августа 2011

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

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

Для примеров связи с сокетом C Лучшим источником, вероятно, является книга Сетевое программирование Unix . В нем достаточно примеров программ и объяснений.

1 голос
/ 21 августа 2011
  1. (конечная точка транспорта) === (сокет)?

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

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

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

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

  1. Есть ли хорошие ссылки?

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

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

...