c++ ftp send transfer wininet

c++ - Cómo corregir este error: referencia indefinida a `__imp_InternetOpenA ''



ftp send (2)

Quiero hacer un programa C ++ donde enviar archivo .txt con información a mi PC. Tengo mucho en internet pero no puedo encontrar el método que funcione. Cuando uso Dev C ++ me da estos errores: ...: referencia indefinida a __imp_InternetOpenA'' ...: undefined reference to __imp_InternetConnectA'' ...: referencia indefinida a __imp_FtpPutFileA'' ...: undefined reference to __imp_HttpOpenRequestA'' Aquí hay tres ejemplos donde encuentro, pero todos devuelven este error.

<pre> #include <windows.h> #include <wininet.h> #include <iostream> #include <stdio.h> #include <tchar.h> #pragma comment(lib,"wininet.lib") #define ERROR_OPEN_FILE 10 #define ERROR_MEMORY 11 #define ERROR_SIZE 12 #define ERROR_INTERNET_OPEN 13 #define ERROR_INTERNET_CONN 14 #define ERROR_INTERNET_REQ 15 #define ERROR_INTERNET_SEND 16 using namespace std; int main() { // Local variables char filename[] = "file"; //Filename to be loaded char filepath[] = "d://a.jpg"; //Filename to be loaded char type[] = "image/jpeg"; char boundary[] = "--BOUNDARY---"; //Header boundary char nameForm[] = "formname"; //Input form name char iaddr[] = "localhost"; //IP address char url[] = "/http/file.php"; //URL char hdrs[512]={''-''}; //Headers char * buffer; //Buffer containing file + headers char * content; //Buffer containing file FILE * pFile; //File pointer long lSize; //File size size_t result; // Open file pFile = fopen ( filepath , "rb" ); if (pFile==NULL) { printf("ERROR_OPEN_FILE"); getchar(); return ERROR_OPEN_FILE; } printf("OPEN_FILE/n"); // obtain file size: fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file: content = (char*) malloc (sizeof(char)*lSize); if (content == NULL) { printf("ERROR_MEMORY"); getchar(); return ERROR_OPEN_FILE; } printf("MEMORY_ALLOCATED/t /"%d/" /n",&lSize); // copy the file into the buffer: result = fread (content,1,lSize,pFile); if (result != lSize) { printf("ERROR_SIZE"); getchar(); return ERROR_OPEN_FILE; } printf("SIZE_OK/n"); // terminate fclose (pFile); printf("FILE_CLOSE/n"); //allocate memory to contain the whole file + HEADER buffer = (char*) malloc (sizeof(char)*lSize + 2048); //print header sprintf(hdrs,"Content-Type: multipart/form-data; boundary=%s",boundary); sprintf(buffer,"%s/r/nContent-Disposition: form-data; name=/"%s/"; filename=/"% ---------- s/"/r/n",boundary,nameForm,filename); sprintf(buffer,"%sContent-Type: %s/r/n",buffer,type); sprintf(buffer,"%s%s",buffer,content); sprintf(buffer,"%s--%s--/r/n",buffer,boundary); //Open internet connection HINTERNET hSession = InternetOpen("WINDOWS",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hSession==NULL) { printf("ERROR_INTERNET_OPEN"); getchar(); return ERROR_OPEN_FILE; } printf("INTERNET_OPENED/n"); HINTERNET hConnect = InternetConnect(hSession, iaddr,INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1); if(hConnect==NULL) { printf("ERROR_INTERNET_CONN"); getchar(); return ERROR_INTERNET_CONN; } printf("INTERNET_CONNECTED/n"); HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",_T(url),NULL, NULL, NULL,INTERNET_FLAG_RELOAD, 1); if(hRequest==NULL) { printf("ERROR_INTERNET_REQ"); getchar(); } printf("INTERNET_REQ_OPEN/n"); BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer)); if(!sent) { printf("ERROR_INTERNET_SEND"); getchar(); return ERROR_INTERNET_CONN; } printf("INTERNET_SEND_OK/n"); //close any valid internet-handles InternetCloseHandle(hSession); InternetCloseHandle(hConnect); InternetCloseHandle(hRequest); getchar(); return 0; }

<pre> #include <winsock2.h> #include <wininet.h> #include <tchar.h> #include <iostream> #include <stdlib.h> #include <windows.h> //#pragma comment(lib,"wininet.lib") using namespace std; int main() { static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858/nContent-Disposition: form-data; name=/"uploadedfile/"; filename=/"C:/test.txt/"/nContent-Type: text/plain/n/nfile contents here/n-----------------------------7d82751e2bc0858--"; static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858"; HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hSession==NULL) { cout<<"Error: InternetOpen"; } HINTERNET hConnect = InternetConnect(hSession, _T("localhost"),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1); if(hConnect==NULL) { cout<<"Error: InternetConnect"; } HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",_T("upload.php"), NULL, NULL, (const char**)"*/*/0", 0, 1); if(hRequest==NULL) { cout<<"Error: HttpOpenRequest"; } BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata)); if(!sent) { cout<<"Error: HttpSendRequest"; } //close any valid internet-handles InternetCloseHandle(hSession); InternetCloseHandle(hConnect); InternetCloseHandle(hRequest); return 0; }

#include <windows.h> #include <wininet.h> #include <stdio.h> #include <iostream> #define ERROR_OPEN_FILE 10 #define ERROR_MEMORY 11 #define ERROR_SIZE 12 #define ERROR_INTERNET_OPEN 13 #define ERROR_INTERNET_CONN 14 #define ERROR_INTERNET_REQ 15 #define ERROR_INTERNET_SEND 16 using namespace std; int main() { // Local variables static char filename[] = "test.txt"; //Filename to be loaded static char type[] = "image/jpg"; static char boundary[] = "pippo"; //Header boundary static char nameForm[] = "uploadedfile"; //Input form name static char iaddr[] = "localhost"; //IP address static char url[] = "test.php"; //URL char hdrs[255]; //Headers char * buffer; //Buffer containing file + headers char * content; //Buffer containing file FILE * pFile; //File pointer long lSize; //File size size_t result; // Open file pFile = fopen ( filename , "rb" ); if (pFile==NULL) return ERROR_OPEN_FILE; // obtain file size: fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file: content = (char*) malloc (sizeof(char)*lSize); if (content == NULL) return ERROR_MEMORY; // copy the file into the buffer: result = fread (content,1,lSize,pFile); if (result != lSize) return ERROR_SIZE; // terminate fclose (pFile); //allocate memory to contain the whole file + HEADER buffer = (char*) malloc (sizeof(char)*lSize + 2048); //print header sprintf(hdrs,"Content-Type: multipart/form-data; boundary=%s",boundary); sprintf(buffer,"--%s/r/nContent-Disposition: form-data; name=/"%s/"; filename=/"%s/"/r/n",boundary,nameForm,filename); sprintf(buffer,"%sContent-Type: %s/r/n/r/n",buffer,type); sprintf(buffer,"%s%s/r/n",buffer,content); sprintf(buffer,"%s--%s--/r/n",buffer,boundary); //Open internet connection HINTERNET hSession = InternetOpen("WinSock",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hSession==NULL) return ERROR_INTERNET_OPEN; HINTERNET hConnect = InternetConnect(hSession, iaddr,INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1); if(hConnect==NULL) return ERROR_INTERNET_CONN; HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",url, NULL, NULL, (const char**)"*/*/0", 0, 1); if(hRequest==NULL) return ERROR_INTERNET_REQ; BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer)); if(!sent) return ERROR_INTERNET_SEND; //close any valid internet-handles InternetCloseHandle(hSession); InternetCloseHandle(hConnect); InternetCloseHandle(hRequest); return 0; } </pre>


Tuve muchos errores como este en mi primer programa C ++. Es un problema vincular con la biblioteca de WinINet. Si está utilizando MinGW agregue "-lwininet" (sin comillas) a los argumentos de comando adicionales y debería ser corregido. No sé qué hacer si usa VC ++. Además, asegúrese de que la ubicación de la biblioteca de WinINet esté en las rutas de búsqueda del enlazador.


Con CMake simplemente necesitas

target_link_libraries( MY_TARGET ws2_32)