Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нестабильный обмен данными, сокс5  
:(
    Опции темы
Mark4545
Дата 9.9.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



После обмена служебной инфой между клиентом и сервером(сокс5) , идет передача запрашиваемой инфы вот тут то и возникли проблемы.
Код

DWORD WINAPI DataTrans(LPVOID lParam)
{
    SOCKET AThreadS=Accept;//connected broweser
    SOCKET DThreadS=Distanse;//Connected to smth.
    unsigned long state=1;
    ioctlsocket(AThreadS,FIONBIO,(unsigned long*)&state);
    ioctlsocket(DThreadS,FIONBIO,(unsigned long*)&state);
    FD_SET ReadSet;
    int ReadySock;
      FD_ZERO(&ReadSet);
      FD_SET(AThreadS,&ReadSet);
      FD_SET(DThreadS,&ReadSet);
      select(0,&ReadSet,NULL,NULL,NULL);
   while(true)
    {
      char c[1]={0};
      int size=0;  
      size=recv(AThreadS,c,1,0);
      if(size!=0)
      {
          send(DThreadS,c,1,0);
      }
      
      size=recv(DThreadS,c,1,0);
      if(size!=0)
      {
         send(AThreadS,c,1,0);
      }
    }
    return 1;
}

Какой день уже думаю что не так.
PM MAIL   Вверх
W4FhLF
Дата 9.9.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Ну во-первых, в чём смысл передавать по 1 байту? Пусть фрагментацией занимаются более низкие уровни, прикланой уровень этого касаться не должен. Во-вторых ты уверен, что блокирующий режим(синхронный) устанавливается верно? И, наконец, что значит нестабильный?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Mark4545
Дата 9.9.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



Блокирующий устанавливаеться верно например если делать так.
Код

char c[1024]={0};
recv(AThreadS,c,1024,0);
send(DThreadS,c,1024,0);
recv(DThreadS,c,1024,0);
send(AThreadS,c,1024,0);
recv(AThreadS,c,1024,0);
send(DThreadS,c,1024,0);
recv(DThreadS,c,1024,0);
// И так далее.
//Страницы грузяться нормально

В чем заглючаеться не стабильность.Заглючаеться в том что в браузер может попадать мусор
Хеддеры http протокола,может непрально передавать запросы.
Чем больше размер страницы запрашиваемой тем больше шанс на мусор разный или на плохой запрос.
Конечно бывают и удачные запросы редко(и когда страниы мелкие очень).

Это сообщение отредактировал(а) Mark4545 - 9.9.2007, 20:31
PM MAIL   Вверх
Mark4545
Дата 9.9.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



Стал боллее подробно расматривать все запросы, смотрю появляються например вот такая фигня
....
smth Right Headers.
....
....
ost:1.ru//Поидее должен быть Host:1.ru естесно 

Это частный пример одного запроса,куда девалась в данном случае буква H непонятно
PM MAIL   Вверх
yar
Дата 9.9.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Попробуйте сделать размер буфера 2
Код

char c[2]={0};

При этом оставив в send и recv 1.

Возможно, происходит переполнение.
В этом можно убедиться, взглянув в отладчике на содержимое c.
--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
Mark4545
Дата 9.9.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



Решил проблему обнулением массивов,после того как size==0

Добавлено через 6 минут и 25 секунд
Тем возникла еще одна проблемка)
Код представленый ниже,по какой то причине не пашет,но если раскоментировать мессадж боксы то пашет все ок.
В чем трабла?
Код

DWORD WINAPI DataTrans(LPVOID lParam)
{
     SOCKET AThreadS=Accept;//connected broweser
     SOCKET DThreadS=Distanse;//Connected to smth.
     unsigned long state=1;
     ioctlsocket(AThreadS,FIONBIO,(unsigned long*)&state);
     ioctlsocket(DThreadS,FIONBIO,(unsigned long*)&state);
     FD_SET ReadSet;
     int ReadySock;
      FD_ZERO(&ReadSet);
      FD_SET(AThreadS,&ReadSet);
      FD_SET(DThreadS,&ReadSet);
      select(0,&ReadSet,NULL,NULL,NULL);
      char c[1024]={0};
      int size=0;
      int count=0;
      while(1)
      {
        //MessageBox(0,"While",0,0);
        size=recv(AThreadS,c,1024,0);
        if(size>0)
        {
            send(DThreadS,c,1024,0);
            //MessageBox(0,c,"size1>0(Browser send to server)",0);
            count=0;
        }
        else
        {
            ZeroMemory(c,1024);
            //MessageBox(0,c,"size1<=0",0);
            count=count+1;
        }
        size=recv(DThreadS,c,1024,0);
        if(size>0)
        {
            send(AThreadS,c,1024,0);
            //MessageBox(0,c,"size2>0(Server to browser)",0);
            count=0;
        }
        else
        {
            ZeroMemory(c,1024);
            //MessageBox(0,c,"size2<=0",0);
            count=count+1;
        }
        if(count>=4)
        {
            //MessageBox(0,"exit",0,0);
            ExitThread(0);
        }    
      }
    return 1;
}


Добавлено через 11 минут и 57 секунд
а если например заменить все мессадж боксы секундным слипом  то тогда пашет гуд но страницы большие грузит оч долго.
PM MAIL   Вверх
yar
Дата 10.9.2007, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Решение может заключаться в использовании многопоточности.  Один поток читает из Accept сокета и пишет в Distanse, второй читает из Distanse и пишет в Accept.

--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
W4FhLF
Дата 10.9.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Цитата(Mark4545 @  9.9.2007,  22:11 Найти цитируемый пост)
Код представленый ниже,по какой то причине не пашет,но если раскоментировать мессадж боксы то пашет все ок.


Я собственно поэтому и спросил, установил ли ты блокирующий режим правильно? Видимо, нет. У тебя программа пытается считать из сокета данные, которые туда ещё не пришли. Решается проблема просто, есть функция select, которая может проверять возможность чтения данных из массива сокетов. Вот её и используй. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
040375
Дата 11.9.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 6.4.2006

Репутация: 2
Всего: 2



Так он её и использует, только на мой взгляд неправильно. какой смысл в использовании ioctlsocket, если используется select?  
Какой смысл в использовании вызова select вне цикла? Ведь этот вызов устанавливает и считывает флаги состояния сокетов. Каждый раз после завершения операции чтения/записи в дескриптор нужно снова вызывать select - чтобы определить - какие данные готовы к отправке - а какие пришли в буфер для чтения. А в чего желать от такого кода - непонятно. Я под виндой не работаю, но select и прочее - что называется winsock2 в винде - из BSD - всё похоже.
PM MAIL   Вверх
Mark4545
Дата 12.9.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



да там селект полностью непрально использовано.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.