Показать сообщение отдельно

  #2  
Старый 10.07.2008, 02:21
SlyBit
Познающий
Регистрация: 04.07.2008
Сообщений: 56
Провел на форуме:
390892

Репутация: 60
По умолчанию

Аплоад файла по HTTP протоколу.

Данный исходный текст показывает как отослать файл на сервер по http протоколу методом POST. Имя файла передается в поле Request-URI, сам файл в Entity-Body. На сервере обрабатывает запрос и сохраняет файл простейший скрипт upload.php.

SendFileToServer.cpp:
Код:
// by SlyBit (c) 07.2008 /SendFileToServer.cpp/
  
#include "winsock2.h"
#include <windows.h>
  
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(linker, "/ENTRY:Entry")
   
#define HOST_NAME "test.ru"
#define FILE_NAME "test_file.rar"
#define URL_NAME  "upload.php" 
 
BOOL WINAPI SendDataToServer(PVOID pData, DWORD dwDataSize, WORD wPort, PCHAR pAddress)
{
    SOCKET      ConnectSocket;
    sockaddr_in ClientService; 
    INT         nSendBytes = 0;
    
    if(INVALID_SOCKET == (ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) {
        return 0;
    }
    
    ClientService.sin_family = AF_INET;
    ClientService.sin_port = htons(wPort);
    ClientService.sin_addr.s_addr = inet_addr(pAddress);
    
    if(SOCKET_ERROR == connect(ConnectSocket, (SOCKADDR*)&ClientService, sizeof(ClientService))) {
        closesocket(ConnectSocket);
        return 0;
    }
    
    if(SOCKET_ERROR == (nSendBytes = send(ConnectSocket, (PCHAR)pData, dwDataSize, 0))) {
        closesocket(ConnectSocket);
        return 0;
    }
    
    closesocket(ConnectSocket);
    
    return nSendBytes;
}
    
BOOL WINAPI GetIpByHostName(PCHAR pHostName, PCHAR pIp, DWORD dwIpSize)
{
    hostent *pHosten;
    
    if(!(pHosten = gethostbyname(pHostName))) {
        return 0;
    }
    
    if(lstrlen(inet_ntoa(*(in_addr*)*pHosten->h_addr_list)) > dwIpSize) {
        return 0;
    }
    
    lstrcpy(pIp, inet_ntoa(*(in_addr*)*pHosten->h_addr_list));
   
    return 1;
}
   
BOOL WINAPI SendFileToServer(PCHAR pFileName, PCHAR pAddress, PCHAR pUrl)
{
    PVOID   pFile;
    DWORD   dwFileSize, dwRetSize;
    CHAR    szIp[17];
    PCHAR   pSendData;
    HANDLE  hFile;
   
    if(!GetIpByHostName(pAddress, szIp, 17)) {
        return 0;
    }
   
    if(INVALID_HANDLE_VALUE == (hFile = CreateFile(pFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0))) {
        return 0;
    }
    if(0xFFFFFFFF == (dwFileSize = GetFileSize(hFile, 0))) {
        CloseHandle(hFile);
        return 0;
    }
    
    if(!(pSendData = (PCHAR)VirtualAlloc(0, dwFileSize+300, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE))) {
        VirtualFree(pFile, 0, MEM_RELEASE);
        return 0;
    }
    
    wsprintf(pSendData, "POST /%s?file_name=%s HTTP/1.1\r\nHost: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-length: %i\r\n\r\nupload_file=",
        pUrl, pFileName, pAddress, dwFileSize+strlen("upload_file="));
   
    if(!ReadFile(hFile, pSendData+strlen(pSendData), dwFileSize, &dwRetSize, 0)) {
        VirtualFree(pSendData, 0, MEM_RELEASE);
        CloseHandle(hFile);
        return 0;
    }
    CloseHandle(hFile);
   
    if(!SendDataToServer(pSendData, strlen(pSendData), 80, szIp)) {
        VirtualFree(pSendData, 0, MEM_RELEASE);
        return 0;
    }
  
    VirtualFree(pSendData, 0, MEM_RELEASE);
  
    return 1;
}
   
VOID WINAPI Entry()
{   
    WSAData wsaData;
   
    if(NO_ERROR != WSAStartup(MAKEWORD(2,2), &wsaData)) {
        ExitProcess(0);
    }
     
    if(SendFileToServer(FILE_NAME, HOST_NAME, URL_NAME)) {
        MessageBox(0, "SendFileToServer Ok", 0, 0);
    } else {
        MessageBox(0, "SendFileToServer Error", 0, 0);
    }
    
    ExitProcess(0);
}
upload.php:
Код:
<?php Error_Reporting(E_ALL & ~E_NOTICE); 
 
function SaveDataToFile($log_data, $file_name)   
{
    $file = basename($file_name);
    $filehandle = fopen($file, "wb"); 
    fputs($filehandle, $log_data);
    fclose($filehandle);
}
  
SaveDataToFile($_POST['upload_file'], $_GET['file_name']);
  
?>
Полезные ссылки:
Русский RFC по HTTP
Статья "Генерация HTTP запросов"
 
Ответить с цитированием