Boost Socket / Acceptor не может прослушивать / подключаться к одному и тому же порту? - PullRequest
1 голос
/ 27 октября 2011

Я немного новичок в Boost, но я пытаюсь создать сервер, который может принимать соединения от клиента по заданному порту.Этот сервер также должен иметь возможность записи клиенту на тот же порт.

Однако, когда я пытаюсь реализовать оба с использованием acceptor_.bind() / acceptor_.listen(), а также socket_.connect(*iterator), async_accept() завершается с ошибкой недопустимой функции.

Если я использую только acceptor_.bind(), acceptor_.listen() Я могу записать в сокет (с сервера на клиент), используя async_write().

Если я использую только socket_.connect() (но закомментируйте acceptor_.bind(), acceptor_.listen()) Я могу читать из сокета (данные отправляются с клиента на сервер) с помощью async_read_some().

Нужно ли создавать отдельный объект сокета или выбрать другой порт?У меня есть адрес для повторного использования, установленный в True.

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Почему вы пытаетесь connect() клиенту, который уже подключен к вашему серверу?Просто напишите в существующий сокет, который был принят для этого соединения.

Если вам необходимо connect() второе соединение с клиентом (например, как протокол FTP делает для передачи данных), то не указывайтепорт для привязки этого сокета.Позвольте ОС выбрать подходящий порт для использования.

1 голос
/ 28 октября 2011

Похоже, вы не поняли некоторые базовые концепции сетевого программирования, это не связано с бустом или библиотекой Asio. Вообще говоря, серверы вызывают accept(), а клиенты - connect(). Примеры asio показывают это подробно, см.

И обратите внимание, что сервер вызывает

  • async_accept()
  • async_read_some()
  • async_write()

тогда как клиент вызывает

  • connect()
  • write()
  • read()
...