flog("Client connected to redirect socket...\n", 0);
while(1)
{
(1)c_client = recv(sock_client, &bf_client[0], sizeof(bf_client),0);
(2)c_target = recv(sock_target, &bf_target[0], sizeof(bf_target),0);
if(c_client == SOCKET_ERROR) break;
if(c_client == 1)
{
send(sock_target, &bf_client[0], sizeof(bf_client),0);
(3)flog("(" + IntToStr((int)(bf_client[0])) + ")", 0);
}
if(c_target == 1)
{
send(sock_client, &bf_target[0], sizeof(bf_target),0);
}
}
Проблемы с сокс-сервером.
1. Подключение клиента
2. Аутентификация
3. Приём запроса с целевым хостом(1) от клиента
4. Подключение к хосту, который был передан в запросе
5. Создание нового серверного сокета(2) для клиента
6. Отправка клиенту ответа с адресом(локалхост) и портом(сокет из пункта 5)
7. Подключение клиента к сокету (2) и установка accept() на это подключение
8. Обмен данными туда-сюда от (1) к клиенту
После выполнения пункта 6 начинаются неприятности. Клиент(в моём случае, это браузер) не коннектится на выданный ему новый порт.
Поправьте, если я в каких то пунктах ошибся либо покажите исходники самого примитивного сокс сервера, чтобы разобраться что не так. Благодарю :)
Так как браузер к новому сокету(в котором идёт обмен данными между хостом-целью и клиентом) не коннектится, то решил это сделать руками.
Код:
В таком виде код обмена данными не работает. Это показывает лог, который ведётся на строчке (3). Но если закомментировать строчку (2), то те данные что я передаю, логируются. Отсюда вывод код строчек (1) и (2) вместе не работает. Почему?
И как вообще осуществить работу функции посредника по передаче данных между хостом-целью и клиентом?
Вторую проблему частично решил тем, что принимаю от клиента и передаю хосту-цели в этом же потоке, а в обратном направлении данные идут в параллельном процессе.
Таким образом получается что данные передаются туда-сюда в двух параллельно-работающих процессах, в каждом из которых стоит while(1), что грузит систему на 99%. Подскажите, как поправить это?
Но... не получается играть во флэш-игры(в контакте, например). Эти игры постоянно передают данные туда-сюда и сокс не может с этим справитсья?
Есть догадки, где я мог ошибиться или весь код сюда бросать? (его много)
Проблема решена. Так как потоки были парные, один от клиента, другой от цели, и иногда клиент или цель закрывали свой поток, то нужно было закрывать парный для него.