Как узнать, когда байты отправлять / получать с клиентского сервера C ++ - PullRequest
0 голосов
/ 16 февраля 2011

У меня вопрос, когда у вас есть прокси-сервер, и вам нужно отправить / recv с клиентом и отправить / recv с удаленного сервера, как узнать, с какой стороны есть данные для отправки / записи, чтобы я мог вызывать соответствующие функции , Мне нужно получать / отправлять байты с веб-сайта клиенту (через прокси-сервер) и от клиента к серверу (через прокси-сервер), но я не знаю, в каком порядке они поступают, я видел, что это отличается для большинства сайтов
Моя текущая реализация такова:

1) receive from client
2) send to server
//infinite loop here
3) receive from server
4) send to client
// until bytes from server is 0

Это работает только для нескольких сайтов и не загружает их полностью, всего 15-20 КБ.
Есть предложения?

Ответы [ 3 ]

1 голос
/ 16 февраля 2011

Ваша задача будет пересылать данные с клиента на сервер и обратно.Поскольку клиент и сервер могут передавать данные одновременно, подход, когда вы читаете все с клиента, чем передавать его на сервер, и наоборот, не сработает: рассмотрите ситуацию, когда вы ожидаете, когда клиент начнет передачу, и клиент хочет получить данные с сервера, прежде чем запустить его.собственная передача.
Итак, есть следующие способы заставить это работать:

  1. Построить два явных канала - один от клиента к серверу, другой от сервера к клиенту.Для этого потребуется 4 потока - одно чтение с клиента и передача данных другому, запись на сервер и наоборот.Недостатком является наличие 4 потоков на клиента, что ограничивает число одновременных клиентов, которые может поддерживать ваш прокси.
  2. Использование select(2) функциональности (или аналогичного вызова sys из Windows API) + неблокирующие сокеты.Это скажет вам, когда есть данные для чтения или записи.Неблокирующие сокеты необходимы, если вы хотите обслуживать несколько клиентов в одном потоке, чтобы поток не блокировался в системном вызове чтения / записи.
    На странице руководства есть образец select и много информации в Интернете.

Одна известная страница, посвященная разработке серверов, здесь .

0 голосов
/ 16 февраля 2011

Используйте select(), чтобы дождаться получения данных с любой стороны, затем прочитайте их и передайте.

0 голосов
/ 16 февраля 2011

получить от клиента отправить на сервер, а (true) {если (recvfrom от сервера не равен нулю) отправить клиенту, если (recvfrom от клиента не равен нулю) отправить на сервер}

Я думаю, это может сработать

...