Russian Qt Forum
Май 05, 2024, 23:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с написанием клиента HTTP  (Прочитано 4938 раз)
erslgoeirjh
Гость
« : Декабрь 16, 2005, 10:37 »

Имеется такой код:

BOOL  MySendFile(TCHAR* myfilename)
// посылка выбранного файла на сервер
{

    int  sock, recv_len, af, sendres, res;
    unsigned long  mysize, szCodedData, lSize;
    TCHAR answercode[4], recv_buf[1024], *CodedData, mystrsize[10], myhostname[80];
    struct sockaddr_in  servAddr;
    struct hostent *hp;
    FILE *f;
    WSADATA  W;
   
    f = fopen(myfilename,"rb");
    fseek(f,0,SEEK_END);
    lSize = ftell(f);
    fclose(f);
    szCodedData = (unsigned long)(1.5*(long double)lSize);
    CodedData = new TCHAR[szCodedData];
    if (!(mysize=base64encode(myfilename,CodedData,szCodedData)))
    // myfilename -- имя выбранного файла
    // CodedData -- буфер, в который кодируется по методу base64 этот файл
    // szCodedData -- размер этого буфера
    {
        MessageBox(NULL,"Невозможно преобразовать файл по методу base64.","Ошибка",MB_OK);
        delete []CodedData;
        return  FALSE;
    }
    res = WSAStartup(0x0101,&W);
    sock = socket(AF_INET,SOCK_STREAM,0);    
    if (sock<0)
    {
        MessageBox(NULL,"Невозможно создать сокет.","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    memset((TCHAR*)&servAddr,0,sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    hp = gethostbyname("localhost");
    memcpy(&servAddr.sin_addr,hp->h_addr,hp->h_length);
    servAddr.sin_port = htons(PORTNUMBER);
    if (res = connect(sock,(sockaddr*)&servAddr,sizeof(servAddr))<0)
    {
        MessageBox(NULL,"Невозможно установить сокетное соединения.","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    strcpy(mymessage,"POST /upload.php HTTP/1.1\r\n");                // &iuml;&eth;&agrave;&acirc;&egrave;&euml;&uuml;&iacute;&icirc; &euml;&egrave;?
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Host: ");                          
    strcat(mymessage,"localhost");
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Type: multipart/form-data;\r\n\tboundary=----------164756348538\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    /* strcpy(mymessage,"Content-Length: "); // &oacute;&ograve;&icirc;?&iacute;&egrave;&ograve;&uuml; &iacute;&agrave;&ntilde;?&cedil;&ograve; Content-Length
    ultoa(mysize,mystrsize,10);
    strcat(mymessage,mystrsize);
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    } */
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Connection: close\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Cache-control: no-cache\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"------------164756348538\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Disposition: form-data; name=\"send_file\"; filename=\"");
    strcat(mymessage,myfilename);
    strcat(mymessage,"\"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Type: application/octet-stream\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Length: ");
    ultoa(mysize,mystrsize,10);
    strcat(mymessage,mystrsize);
    strcat(mymessage,"\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"Content-Transfer-Encoding: base64\r\n\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    sendres = send(sock,CodedData,mysize,0);    // &icirc;&ograve;&iuml;&eth;&agrave;&acirc;&euml;&yuml;&aring;&igrave; &ocirc;&agrave;&eacute;&euml; &iacute;&agrave; &ntilde;&aring;&eth;&acirc;&aring;&eth;
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    //recv_len = recv(sock,recv_buf,strlen(recv_buf),0);
    strcpy(mymessage,"------------164756348538--\r\n");
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {
        MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_len = recv(sock,recv_buf,strlen(recv_buf),0); // &ntilde;?&egrave;&ograve;&ucirc;&acirc;&agrave;&aring;&igrave; &icirc;&ograve;&acirc;&aring;&ograve; &ntilde; &ntilde;&aring;&eth;&acirc;&aring;&eth;&agrave;
    if (recv_len<=0)
    // если длина ответа меньше или рана нулю
    {
        res = WSAGetLastError();
        MessageBox(NULL,"Ошибка приёма ответа с сервера","Ошибка",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
    recv_buf[recv_len] = '\0';
    MessageBox(NULL,(LPCTSTR)recv_buf,"Ответ сервера",MB_OK);
    /* strncpy(answercode,recv_buf,3);   // &ntilde;?&egrave;&ograve;&ucirc;&acirc;&agrave;&aring;&igrave; &ccedil;&iacute;&agrave;?&aring;&iacute;&egrave;&aring; &ecirc;&icirc;&auml;&agrave; &icirc;&ograve;&acirc;&aring;&ograve;&agrave; &ntilde;&aring;&eth;&acirc;&aring;&eth;&agrave;
    answercode[3] = '\0';
    if ((strcmp(answercode,"200")!=0)&&(strcmp(answercode,"201")!=0))
    // &aring;&ntilde;&euml;&egrave; &ecirc;&icirc;&auml; &icirc;&ograve;&acirc;&aring;&ograve;&agrave; &ntilde;&aring;&eth;&acirc;&aring;&eth;&agrave; &iacute;&aring; &eth;&agrave;&acirc;&aring;&iacute; 200 &egrave;&euml;&egrave; 201
    {
        MessageBox(NULL,"&Iacute;&aring;&oacute;&auml;&agrave;?&iacute;&agrave;&yuml; &iuml;&aring;&eth;&aring;&auml;&agrave;?&agrave; &ocirc;&agrave;&eacute;&euml;&agrave;.","&Icirc;&oslash;&egrave;&aacute;&ecirc;&agrave;",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }  */
    closesocket(sock);
    WSACleanup();
    delete []CodedData;
    return  TRUE;
} // конец функции MySendFile
 


Суть этой функции такова -- методом POST посылает на сервер бинарный файл (заданный параметром myfilename), предварительно закодировав его методом base64.

При этом в блоке
    strcpy(mymessage,"Content-Type: application/octet-stream\r\n");  
    sendres = send(sock,mymessage,strlen(mymessage),0);
    if (sendres==SOCKET_ERROR)
    {   res = WSAGetLastError();
        MessageBox(NULL,"&Icirc;&oslash;&egrave;&aacute;&ecirc;&agrave; &iuml;&eth;&egrave; &iuml;&icirc;&ntilde;&ucirc;&euml;&ecirc;&aring; &auml;&agrave;&iacute;&iacute;&ucirc;&otilde;","&Icirc;&oslash;&egrave;&aacute;&ecirc;&agrave;",MB_OK);
        closesocket(sock);
        WSACleanup();
        delete []CodedData;
        return  FALSE;
    }
 

возникает ошибка при передаче сообщения функцией send (но до этого вызовы send работают нормально). Код этой ошибки -- 10053. Одна из причин этой ошибки может быть в том, что я не правильно написал заголовок или тело метода POST. (Я некоторые части кода закомментировал для отлладки).

В чём может быть причина этого?

На моём компьютере стоит сервер UniServer, ниже приведён HTML-код страницы http://localhost/ :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf8" />
<title>Apache test.</title>
</head>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
 Отправить этот файл: <input name="userfile" type="file" />
 <input type="submit" value="Send File" />
</form>

</body>
</html>
 


Если посылать файл с помощью этой страницы, то посылка происходит успешно, а в результате неё в файле access.log этого сервера добавляется следующая строка:

127.0.0.1 - - [14/Dec/2005:13:30:44 +0300] "POST /upload.php HTTP/1.1" 200 322 "http://localhost/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)"

Если же я посылаю из своей программы, то у меня получается другая строка:

127.0.0.1 - - [14/Dec/2005:17:55:33 +0300] "POST /upload.php HTTP/1.1" 200 148 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

Почему у меня во второй строке не пишется после двух чисел "http://localhost/" ?

Что мне нужно исправить в моей функции, чтобы она нормально работала?
Записан
DmitriyDMA
Гость
« Ответ #1 : Февраль 21, 2006, 14:28 »

[ Это походит на задачку из журнала Хакер =)  ]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 20.