![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Игрь |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 26.6.2006 Репутация: нет Всего: нет |
Здравствуйте люди ....
Вот решил замутить НТТР клиента ,чтобы профиксить принцип работы этого протокола...но появилась небольшая проблема... Всё что связано с НТМL данными всё чин чинарём, но когда программа клиент пытается загрузить gif/jpeg всё сразу стопорится, предварительно послав программу...клиенту какие то карамбули))) А в асинхрнном режиме работы сокетов,просто пропускает загрузку изображений...что делать, как быть ? Да кстати,буфер у проги в видe char Buffer[1000000]; Огромное спасибо... |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Показывай код.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
Игрь |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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); } //--------------------------------------------------------------------------- |
|||
|
||||
Игрь |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 26.6.2006 Репутация: нет Всего: нет |
Вообщем всё фишка в чём....
запускаешь прогу ,открываешь браузер и пишешь туда 127.0.0.1:4444 коннект браузера к проге....а прога потом шлёт запрос и выступает посредником между клиентом и реальным сервером.... Но картинкипочемуто не грузятся (((( |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Завтра посмотрю что там не так.
Кстати не забывай пользоваться кнопкой "Код". -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
ptr |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Наверное всё же IPPROTO_TCP.
Зачем повторяешь этот код два раза?
Не понял.
Тут скорее всего должен быть цикл. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
||||||
|
|||||||
Игрь |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 26.6.2006 Репутация: нет Всего: нет |
Наверное всё же IPPROTO_TCP.
Зачем повторяешь этот код два раза? ====================================== Сорри...просто копируя это дело на форум...я переборщил с Ctrl+V....и забыл затереть
Не понял. ========================================================== А это задержка, для того чтобы функция recv успевала подчерпнуть пришедшие даные, которые приходят с задержкой.. Может из-за асинхронного режима...хз Добавлено @ 03:09 Так вот и не понятно...почему хтмл код проходит,а гифы и джейпеги нет... выводит ошибку сокета...мол хотел получить данные,да не получилось((( Добавлено @ 03:14
Тут скорее всего должен быть цикл. ======================================== Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...да кстати,огромное спасибо за твоё внимание... Это сообщение отредактировал(а) Игрь - 20.11.2006, 03:19 |
||||||
|
|||||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
||||
|
||||
ptr |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Не очень хорошее решение, а точнее даже бесполезное. Зачем тогда нужна асинхронность? Если ты хочешь использовать асинхронный режим, то должен корректно обрабатывать ошибки (например когда данных нет).
Что за ошибка.
recv возвращает только те данные, которые в данный момент есть. Т.е., например, если ты посылаешь много данных, то за один раз они могут не прочитаться, просто не успеют дойти, поэтому тут нужен цикл. И такой большой буфер здесь просто не нужен. Это сообщение отредактировал(а) ptr - 20.11.2006, 17:18 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
||||||
|
|||||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |