user2934520
user2934520

Reputation: 29

C++ FTP writing to file is not working

I wrote this code that is SUPPOSED to write to a file on an ftp server, but it doesn't work. The file stays 0 bytes. There are also no errors. Here's my code:

#include <windows.h>
#include <wininet.h>
#include <stdio.h>

int main()
{
    int error=0;
    char buffer[256];
    char *text="Hello world.";
    HINTERNET hOpen=InternetOpen("",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_PASSIVE);
    InternetGetLastResponseInfo((LPDWORD)error,(LPSTR)buffer,(LPDWORD)256);
    printf("hOpen:%d:%s\n",error,buffer);
    HINTERNET hConnect=InternetConnect(hOpen,"diabloip.host22.com",INTERNET_DEFAULT_FTP_PORT,"MY_USER_NAME","MY_PASSWORD",INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
    InternetGetLastResponseInfo((LPDWORD)error,(LPSTR)buffer,(LPDWORD)256);
    printf("hConnect:%d:%s\n",error,buffer);
    HINTERNET hFile=FtpOpenFile(hConnect,"diabloip.host22.com/public_html/log.txt",GENERIC_WRITE,FTP_TRANSFER_TYPE_ASCII,0);
    InternetGetLastResponseInfo((LPDWORD)error,(LPSTR)buffer,(LPDWORD)256);
    printf("hFile:%d:%s\n",error,buffer);
    InternetWriteFile(hFile,text,strlen(text),NULL);
    return 0;
}

Upvotes: 1

Views: 1285

Answers (1)

Retired Ninja
Retired Ninja

Reputation: 4925

The problem is passing NULL as the last parameter to InternetWriteFile. It is not an optional parameter and if you had error checking for that call as the rest you'd see GetLastError returns 87, or ERROR_INVALID_PARAMETER.

This works correctly and cleans up some of the other issues with incorrect parameters and the excessive casting that masks the issues.

#include <windows.h>
#include <wininet.h>
#include <stdio.h>

#pragma comment(lib, "wininet.lib")

void PrintStatus(const char* title)
{
    DWORD error = 0;
    DWORD sz = 256;
    char buffer[256];
    InternetGetLastResponseInfo(&error, buffer, &sz);
    printf("%s:%u:%s\n", title, error, buffer);
}

int main()
{
    const char *text = "Hello world.";
    HINTERNET hOpen = InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_PASSIVE);
    PrintStatus("hOpen");
    HINTERNET hConnect = InternetConnect(hOpen, "localhost", INTERNET_DEFAULT_FTP_PORT, "test", "test", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    PrintStatus("hConnect");
    HINTERNET hFile = FtpOpenFile(hConnect, "log.txt", GENERIC_WRITE, FTP_TRANSFER_TYPE_ASCII, 0);
    PrintStatus("hFile");
    DWORD wb = 0;
    BOOL Success = InternetWriteFile(hFile, text, strlen(text), &wb);
    if(!Success)
    {
        DWORD err = GetLastError();
        printf("InternetWriteFile - Error = %u\n", err);
    }
    PrintStatus("InternetWriteFile");
    InternetCloseHandle(hOpen);
    return 0;
}

Upvotes: 1

Related Questions