Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с сокс-сервером.

2.2K
23 октября 2010 года
cls
24 / / 26.07.2003
Пишу сокс сервер. Вот схема общения сервера с клиентом:
1. Подключение клиента
2. Аутентификация
3. Приём запроса с целевым хостом(1) от клиента
4. Подключение к хосту, который был передан в запросе
5. Создание нового серверного сокета(2) для клиента
6. Отправка клиенту ответа с адресом(локалхост) и портом(сокет из пункта 5)
7. Подключение клиента к сокету (2) и установка accept() на это подключение
8. Обмен данными туда-сюда от (1) к клиенту

После выполнения пункта 6 начинаются неприятности. Клиент(в моём случае, это браузер) не коннектится на выданный ему новый порт.

Поправьте, если я в каких то пунктах ошибся либо покажите исходники самого примитивного сокс сервера, чтобы разобраться что не так. Благодарю :)
2.2K
23 октября 2010 года
cls
24 / / 26.07.2003
Нашёл ещё один косяк.

Так как браузер к новому сокету(в котором идёт обмен данными между хостом-целью и клиентом) не коннектится, то решил это сделать руками.

Код:
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);
                }
            }


В таком виде код обмена данными не работает. Это показывает лог, который ведётся на строчке (3). Но если закомментировать строчку (2), то те данные что я передаю, логируются. Отсюда вывод код строчек (1) и (2) вместе не работает. Почему?

И как вообще осуществить работу функции посредника по передаче данных между хостом-целью и клиентом?
2.2K
23 октября 2010 года
cls
24 / / 26.07.2003
С первым вопросом разобрался сам. Получать данные от клиента надо было в том же сокете, что и запрос/ответ передавались.

Вторую проблему частично решил тем, что принимаю от клиента и передаю хосту-цели в этом же потоке, а в обратном направлении данные идут в параллельном процессе.
Таким образом получается что данные передаются туда-сюда в двух параллельно-работающих процессах, в каждом из которых стоит while(1), что грузит систему на 99%. Подскажите, как поправить это?
2.2K
24 октября 2010 года
cls
24 / / 26.07.2003
Переписал весь код с многопоточного на WSASyncSelect'овый. Сокс заработал, систему не вешает, страницы грузятся нормально, видео потоковое даже можно смотреть.
Но... не получается играть во флэш-игры(в контакте, например). Эти игры постоянно передают данные туда-сюда и сокс не может с этим справитсья?

Есть догадки, где я мог ошибиться или весь код сюда бросать? (его много)
2.2K
25 октября 2010 года
cls
24 / / 26.07.2003
Проблема решена. Так как потоки были парные, один от клиента, другой от цели, и иногда клиент или цель закрывали свой поток, то нужно было закрывать парный для него.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог