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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> НТТР клиент.. Всё что связано с НТМL данными всё чин ч 
:(
    Опции темы
Игрь
  Дата 15.11.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте люди .... 


Вот решил замутить НТТР клиента ,чтобы профиксить принцип работы этого протокола...но появилась небольшая проблема... 

Всё что связано с НТМL данными всё чин чинарём, но когда программа клиент пытается загрузить gif/jpeg  всё  сразу стопорится, предварительно послав программу...клиенту какие то карамбули)))
А в асинхрнном режиме работы сокетов,просто пропускает загрузку изображений...что делать, как быть ? 

Да кстати,буфер у проги в видe char Buffer[1000000];

Огромное спасибо...
PM MAIL   Вверх
ptr
Дата 15.11.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Показывай код.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Игрь
Дата 15.11.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



//---------------------------------------------------------------------------

#include <winsock2.h>
#include <iostream.h>
#pragma    hdrstop

//---------------------------------------------------------------------------
#pragma argsused
#define PORT 4444


int main(int argc, char* argv[])
{
   WSADATA wsaData;
   int err = WSAStartup(MAKEWORD(2, 0), &wsaData);
   if(err != 0)
   {
      cout<<"Does not manage to load library an socket"<<endl;
      Sleep(10000);
      return(1);
   }

   int Size;
   SOCKET Server,Client,Connect;
   unsigned long UlongMode;
   sockaddr_in ServerAddr,ClientAddr,ConnectAddr;
   hostent *host=NULL;
   char szServerName[1024];
   strcpy(szServerName,"127.0.0.1");


   if((Server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
   return(1);

   UlongMode=1;
   ioctlsocket(Server,FIONBIO,(unsigned long*)&UlongMode);

   ServerAddr.sin_family=AF_INET;
   ServerAddr.sin_port=htons(PORT);
   ServerAddr.sin_addr.s_addr=htons(INADDR_ANY);



   if(bind(Server,(sockaddr*)&ServerAddr,sizeof(ServerAddr))==INVALID_SOCKET)return(1);

           if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
           return(1);
           ConnectAddr.sin_family=AF_INET;
           ConnectAddr.sin_port=htons(80);
           ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);




   listen(Server,5);
   FD_SET ReadSet;
   int ReadySock,ret;

   while(true)
   {

          if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

          if(ConnectAddr.sin_addr.s_addr==INADDR_NONE)
          {
           host=gethostbyname(szServerName);
           if(host==NULL)
           {
             cout<<"Error"<<endl;
             Sleep(1000);
             return(1);
           }
           CopyMemory(&ConnectAddr.sin_addr,host->h_addr_list[0],host->h_length);
          }

        FD_ZERO(&ReadSet);
    FD_SET(Server,&ReadSet);
        //timeval times;
        //times.tv_sec=2;
        //times.tv_usec=0;

        if ((ReadySock=select(0,&ReadSet,NULL,NULL,NULL))==SOCKET_ERROR)
    {
        MessageBox(0, "Select filed", "Error", 0);
    }

        if (FD_ISSET(Server,&ReadSet))
    {
        int iSize = sizeof(ClientAddr);
            Client=accept(Server,(sockaddr *)&ClientAddr, &iSize);
        if (Client == INVALID_SOCKET)
            {
            MessageBox(0, "Accept filed", "Error", 0);
            break;
        }
                cout<<inet_ntoa(ClientAddr.sin_addr)<<endl;
        }
         cout<<"ok"<<endl;
         char RecvBuff[1000000];
         while(true)
         {
           Sleep(20);
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Mistake acceptance data"<<endl;
             break;
           }

           if(ret==0)
           {
             cout<<"No pol send"<<endl;
             break;
           }
           RecvBuff[ret]='\0';
           cout<<RecvBuff<<endl;
           if(connect(Connect,(sockaddr*)&ConnectAddr,sizeof(ConnectAddr))==SOCKET_ERROR)
           {
              cout<<"Connect active\n"<<endl;
           }

           if((ret=send(Connect,RecvBuff,strlen(RecvBuff),0))==SOCKET_ERROR)

           {
              cout<<"Error send"<<endl;
              cout<<WSAGetLastError()<<endl;
              break;
           }
           memset(RecvBuff,0,sizeof(RecvBuff));
           ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }
           if(ret==0)
           {
             cout<<"No pol send"<<endl;
             break;
           }
           RecvBuff[ret]='\0';
           cout<<RecvBuff<<endl;

           if((ret=send(Client,RecvBuff,strlen(RecvBuff),0))==SOCKET_ERROR)
           {
            cout<<"Not to manage to send data"<<endl;
            break;
           }
           memset(RecvBuff,0,sizeof(RecvBuff));

        }
        cout<<"Closed connected"<<endl;
        closesocket(Client);

   }
   cout<<"Closed server"<<endl;
   closesocket(Server);
   cin>>"";

 return(0);
}
//---------------------------------------------------------------------------
PM MAIL   Вверх
Игрь
Дата 16.11.2006, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем всё фишка в чём....
запускаешь прогу ,открываешь браузер и пишешь туда 127.0.0.1:4444
коннект браузера к проге....а прога потом шлёт запрос и выступает посредником между клиентом и реальным сервером....
Но картинкипочемуто не грузятся (((( 
PM MAIL   Вверх
ptr
Дата 18.11.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Завтра посмотрю что там не так.

Кстати не забывай пользоваться кнопкой "Код".


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ptr
Дата 19.11.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(Игрь @  16.11.2006,  01:05 Найти цитируемый пост)
IPPROTO_IP

Наверное всё же IPPROTO_TCP.

Код

if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

Зачем повторяешь этот код два раза?

Код

 while(true)
         {
           Sleep(20);???
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);

Не понял.

Код

 ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }

Тут скорее всего должен быть цикл.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Игрь
Дата 20.11.2006, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Игрь @  16.11.2006,  01:05 Найти цитируемый пост)
IPPROTO_IP

Наверное всё же IPPROTO_TCP.

Код

if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

Зачем повторяешь этот код два раза?
======================================
Сорри...просто копируя это дело на форум...я переборщил с Ctrl+V....и забыл затереть

Код

 while(true)
         {
           Sleep(20);???
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);

Не понял.
==========================================================
А это задержка, для того чтобы функция recv успевала подчерпнуть пришедшие даные, которые приходят с задержкой..
Может из-за асинхронного режима...хз

Добавлено @ 03:09 
Так вот и не понятно...почему хтмл код проходит,а гифы и джейпеги нет...
выводит ошибку сокета...мол хотел получить данные,да не получилось(((

Добавлено @ 03:14 
Код

 ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }

Тут скорее всего должен быть цикл.
========================================
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...да кстати,огромное  спасибо за твоё внимание...

Это сообщение отредактировал(а) Игрь - 20.11.2006, 03:19
PM MAIL   Вверх
En_t_end
Дата 20.11.2006, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Игрь @  20.11.2006,  07:01 Найти цитируемый пост)
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...

нет
PM MAIL ICQ Skype GTalk Jabber   Вверх
ptr
Дата 20.11.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
А это задержка, для того чтобы функция recv успевала подчерпнуть пришедшие даные, которые приходят с задержкой..Может из-за асинхронного режима...хз

Не очень хорошее решение, а точнее даже бесполезное. Зачем тогда нужна асинхронность? Если ты хочешь использовать асинхронный режим, то должен корректно обрабатывать ошибки (например когда данных нет).

Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
выводит ошибку сокета...мол хотел получить данные,да не получилось(((

Что за ошибка.

Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...да кстати,огромное  спасибо за твоё внимание...

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


Это сообщение отредактировал(а) ptr - 20.11.2006, 17:18


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


 




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


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

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